Obtener mensajes de error cuando $wpdb->insert() devuelve false
$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

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.

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

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.

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í.

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