Obtener mensajes de error cuando $wpdb->insert() devuelve false

23 ago 2017, 15:03:48
Vistas: 29.3K
Votos: 17

$wpdb->insert() devuelve false lo que he aprendido significa que la inserción falló. Ahora, me gustaría saber por qué falla la inserción.

Según este ticket https://core.trac.wordpress.org/ticket/32315 el problema podría ser que el valor es demasiado largo o contiene caracteres incorrectos.

Aquí está la consulta de inserción:

$result = $wpdb->insert('table', $ins_args, array('%d', '%d', '%s', '%s', '%s', '%s'));

Es difícil mostrar los valores del array $ins_args ya que algunos valores son bastante largos. Especialmente el del campo llamado value. Pero uso el tipo longtext para ese campo. Y esta inserción se usa mucho. Y la mayoría de las veces funciona con éxito. Así que realmente parece ser un problema de codificación o tamaño.

¿Cómo puedo saber cuál es el problema? $wpdb->last_error está vacío

10
Comentarios

Verifica $wpdb->last_error para errores al insertar

Anton Lukin Anton Lukin
23 ago 2017 15:06:35

@Anton Lukin Sí, lo siento, debería haberlo mencionado. Por supuesto que lo intenté pero está vacío.

Peter Westerlund Peter Westerlund
23 ago 2017 15:14:34

Intenta depurarlo. Usa $wpdb->last_query después de insertar, luego ejecuta esa consulta mediante el cliente mysql para ver el error. ¿Es posible?

Anton Lukin Anton Lukin
23 ago 2017 15:17:51

@Anton Lukin Aunque la última consulta es un insert(), el $wpdb->last_query justo después muestra una consulta SELECT * FROM .....

Peter Westerlund Peter Westerlund
23 ago 2017 15:31:23

Podemos ganarlo :) agrega savequeries en tu wp-config.php https://wordpress.stackexchange.com/a/110270/126253

Anton Lukin Anton Lukin
23 ago 2017 15:34:17

@Anton Lukin Maldita sea, me equivoqué con el retorno. Devuelve false, no 0. Es un poco difícil obtener las consultas en el footer ya que mis operaciones se realizan con ajax. Pero intenté colocarlo después del código en el php que llama ajax. Y luego lo llamé desde el navegador. Ahora encontré que algo se rompe en el camino, en el bucle. Tengo que desglosar qué es eso. Pero es algo después del insert fallido. Así que todavía hay un problema allí. Pero difícil de depurar... Seguiré intentando...

Peter Westerlund Peter Westerlund
23 ago 2017 15:57:42

@Anton Lukin Vale, ahora encontré la consulta. Entonces, aparentemente esto falla: [75] => Array ( [0] => INSERT INTO results (parent_id, parent_id, key_code, value, url, cat_ids) VALUES (0, 7, 'posts', '', '', '') [1] => 0.0037600994110107 [2] => do_action('wp_ajax_my_save_result'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, my_save_result, pw_save, PW->save_result, PW->get_posts )

Peter Westerlund Peter Westerlund
23 ago 2017 16:09:02

¿Está bien tener doble parent_id, parent_id en tu consulta?

Anton Lukin Anton Lukin
23 ago 2017 16:12:13

@Anton Lukin Lo siento, eso está mal, el segundo es parent_x_id. Quería mantenerlo un poco secreto.

Peter Westerlund Peter Westerlund
23 ago 2017 16:15:45

Vale, logré solucionarlo saneando la url y el value con esc_url() y esc_html() antes del insert();. Sigue siendo malo sin mensajes de error al respecto...

Peter Westerlund Peter Westerlund
23 ago 2017 16:37:24
Mostrar los 5 comentarios restantes
Todas las respuestas a la pregunta 2
3
18

El método $wpdb->insert() devuelve false si la fila no pudo insertarse. De lo contrario, devuelve el número de filas afectadas (que siempre será 1).

Puedes activar y desactivar la visualización de errores con show_errors y hide_errors, respectivamente.

<?php $wpdb->show_errors(); ?> 
<?php $wpdb->hide_errors(); ?> 

También puedes imprimir el error (si lo hay) generado por la consulta más reciente con print_error.

<?php $wpdb->print_error(); ?> 

También puedes usar el campo $last_error, que contendrá el texto del error más reciente generado por MySQL.

22 ene 2019 13:18:56
Comentarios

Sería bueno ver un ejemplo del campo $last_error. ¿Es simplemente $wpdb->last_error?

Simon East Simon East
23 ene 2019 07:07:02

Sí, exactamente $wpdb->last_error

Krzysiek Dróżdż Krzysiek Dróżdż
23 ene 2019 09:01:07

Ten en cuenta que, si una escritura se aborta porque una columna es demasiado larga, no se devuelve ningún error. Es decir, $wpdb->last_error estará vacío, y ni $wpdb->show_errors() ni $wpdb->hide_errors() ayudarán. Consulta mi respuesta a continuación para ver una forma de cambiar este comportamiento.

Brian C Brian C
28 ago 2020 11:40:47
2

Lamentablemente, wp-db.php devuelve falso sin ningún error si los datos que intentas escribir en una columna son demasiado largos para caber. Esto se convierte en una pesadilla para depurar sin verificar explícitamente la longitud de cada columna (y es difícil saber las longitudes, aunque wp-db.php proporciona funciones internas).

He creado una pequeña sobreescritura que modifica el comportamiento de wpdb para devolver un error en este escenario. Para instalarlo, simplemente copia y pega el código en tu archivo wp-content/db.php de WordPress. Sobrescribe solo un método corto de wpdb (process_fields()) para agregar un mensaje de error que identifique la columna que es demasiado larga. Ten en cuenta que db.php sobrevivirá a las actualizaciones del núcleo, y puedes simplemente eliminar el archivo wp-content/db.php en cualquier momento para volver al wpdb original.

Aunque yo mismo uso esto, como siempre, prueba antes de usar y el uso es bajo tu propio riesgo.

El código de error está tomado originalmente de una idea de Liam Murphy aquí.

Gist para el archivo db.php aquí

28 ago 2020 11:37:14
Comentarios

Finalmente corregido en WordPress v5.9. https://core.trac.wordpress.org/ticket/32315#comment:82

Bence Szalai Bence Szalai
9 feb 2022 19:07:52

¡¡Finalmente!! Gracias.

Brian C Brian C
10 feb 2022 04:54:08