¿Cómo verifico si mi $wpdb->insert() fue exitoso?

20 jul 2016, 22:10:47
Vistas: 16.5K
Votos: 3

Estoy intentando escribir un pequeño script dentro de mi footer.php (que luego convertiré en un plugin) que envía dos campos de formulario a una tabla personalizada (wp_newsletter). Ya estoy enviando el formulario y escribiendo en la tabla correctamente, pero no sé cómo puedo enviar un mensaje de éxito o falla al usuario. Mi código actual es el siguiente:

<form method="post">
  <input type="text" name="user_name">Nombre
  <input type="text" name="user_email">Email
  <input type="submit">
  <?php echo $message;  ?>
</form>

<?php
global $wpdb;
$table   = $wpdb->prefix . "newsletter";
$name    = sanitize_text_field( $_POST["user_name"] );
$email   = sanitize_email( $_POST["user_email"] );
$message = "";


if( isset($_POST["submit"]) ) {
  if ( is_email($email) && isset($name)) {
    if ( $wpdb->insert( $table, array("name"  => $name, "email" => $email)) != false ) {
      $message = "Tu suscripción fue enviada.";
    }
  }
  else {
    if ( !is_email($email) ) {
        $message = "Dirección de email inválida.";
    } elseif ( !isset($name) ) {
        $message = "El campo nombre es obligatorio.";
    } else {
        $message = "Ambos campos, nombre y email, son obligatorios.";
    }
  }
} else {
    $message = "Por favor, inténtalo de nuevo más tarde.";
}
?>


<?php wp_footer(); ?>

</body>
</html>

Creo que lo estoy probando correctamente, según la documentación de $wpdb que dice:

Esta función devuelve false si la fila no pudo ser insertada. De lo contrario, devuelve el número de filas afectadas (que siempre será 1).

3
Comentarios

¿Dónde querías que apareciera el mensaje? Tienes tu echo $message antes de que se cree el $message.

czerspalace czerspalace
20 jul 2016 22:22:24

Hm, no estaba seguro si podía usarlo antes de la declaración... Pero quería mostrarlo debajo del formulario.

vcamargo vcamargo
20 jul 2016 23:03:10

usa esto !== FALSE e intenta

User User
21 jul 2016 05:24:07
Todas las respuestas a la pregunta 3
0

Devuelve el número de filas insertadas o false en caso de error.

Puedes obtener el ID del registro insertado o false si la inserción falla:

enlace de referencia: https://developer.wordpress.org/reference/classes/wpdb/insert/#return

Así que puedes verificar de la siguiente manera:

$result_check = $wpdb->insert( $table, array("name"  => $name, "email" => $email));
if($result_check){
   //inserción exitosa.
}else{
  //algo salió mal
}
12 abr 2019 14:57:56
6

Cuando me di cuenta de que PHP es un acrónimo de "PHP Hypertext Preprocessor" —con énfasis en "preprocessor"— finalmente entendí que no puedo mezclar PHP y HTML y esperar algún tipo de interactividad con el usuario. Cuando se sirve una página web, el PHP crea el HTML y luego el navegador muestra el HTML. Si el usuario hace algo a lo que el PHP debe responder, debe activar una nueva página PHP/HTML para proporcionar algún tipo de respuesta. (Una alternativa sería usar AJAX para enviar datos de ida y vuelta sin cargar una nueva página. WordPress funciona bien con AJAX y hay tutoriales a un buscador de distancia).

Para un formulario simple como el tuyo, usaría javascript para la verificación de errores. Si el formulario no está completo, previene el envío del formulario con JS. Si el formulario está completo, la acción del formulario puede ser un archivo .php que realiza la inserción en la base de datos y muestra el mensaje de éxito/fracaso en HTML.

21 jul 2016 01:04:59
Comentarios

Gracias por el consejo, Scott. ¿Cómo podría crear un archivo .php que muestre el mensaje de éxito/fallo al usuario?

vcamargo vcamargo
21 jul 2016 03:52:00

Disculpa la demora en responder. En un entorno web, haría que el action del formulario apunte a un archivo .php. Los datos se envían mediante GET al archivo destino. Luego se analizan los datos y se insertan en la base de datos. Finalmente, el archivo .php genera HTML en un nuevo documento web que indica éxito o fallo. Ten en cuenta que esto no le da al usuario muchas oportunidades de corregir errores para lograr un mejor resultado una vez que se carga la nueva página web.

scott scott
25 jul 2016 19:38:09

Sin embargo, en WordPress, consideraría intentar con AJAX. Hay muchos buenos tutoriales, y también buscaría en el Codex, pero aquí hay dos que me funcionaron: https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/ y https://premium.wpmudev.org/blog/using-ajax-with-wordpress/

AJAX permite acceder a la base de datos sin cargar una nueva página web. Así que tendrías un elemento que no tiene contenido HTML hasta que AJAX devuelva éxito/fallo: document.getElementById("results-div").innerHTML = content.result;

scott scott
25 jul 2016 19:42:15

La lógica que maneja el formulario está dentro del mismo archivo del formulario: el footer.php. Solo estoy tratando de que funcione de esta manera, luego puedo separarlo mejor cuando termine con las pruebas. A pesar de esto, no quiero enviar los datos de mi formulario a través de un GET.

vcamargo vcamargo
25 jul 2016 23:09:00

Mi error. Puedes usar POST. Parece que quieres hacer AJAX dentro de footer.php para que no recargue la página. Tendrás que usar JavaScript para enviar/recibir los datos AJAX, pero puedes crear un nuevo archivo .php para manejar la llamada AJAX. (Yo coloco mis archivos .php dentro de un plugin para que todas las dependencias sean manejadas por el sistema de WP.)

scott scott
25 jul 2016 23:13:42

Gracias, scott. Leeré cómo debería publicar con AJAX dentro de WP. No tengo idea.

vcamargo vcamargo
25 jul 2016 23:15:26
Mostrar los 1 comentarios restantes
0

Llegué aquí a través de Google y lo que me ayudó fue usar las propiedades del objeto $wpdb:

$wpdb->last_error

muestra el último error si está presente

$wpdb->last_query

muestra la última consulta que generó el error anterior

17 ene 2018 15:17:17