Mostrando errores con la actualización de $wpdb
Estoy usando $wpdb->update
para actualizar una tabla personalizada que tengo en mi base de datos. Cuando hago var_dump
al resultado, retorna:
int(0)
Entonces intenté usar $wpdb->print_error()
para ver qué está mal. Sin embargo, no muestra nada. También probé $wpdb->show_errors()
, pero nuevamente no mostró nada.
La documentación de wpdb no profundiza en detalles sobre cómo usar estas funciones, así que no estoy seguro si las estoy usando correctamente. Pero ¿por qué el resultado de actualizar una tabla retornaría 0 y no mostraría ningún error?
Mostrar errores:
$wpdb->show_errors = true
muestra errores automáticamente, siWP_DEBUG
está configurado comotrue
.$wpdb->suppress_errors = false
evita que se supriman los errores.Multisite necesita un tratamiento especial
// Mostrar errores en Multisite: global $wpdb, $blog_id; // No hay is_multisite(), así que necesitamos verificar el ID // Esto significa que no podemos depurar el blog con ID 1 como MU-blog por defecto // Verificamos si estamos en el Blog ID#1 y si no, revisamos las definiciones y añadimos manejo de errores if ( 1 !== $blog_id ) ! defined( 'DIEONDBERROR' ) AND define( 'DIEONDBERROR', true );
Manejo de salida
El método $wpdb->update()
tiene tres salidas diferentes. Para verificarlo, debes guardar el resultado en una variable: $result = $wpdb->update( /* ... */ );
.
Luego maneja estos escenarios:
false === $result
: Falló0 === $result
: Éxito, pero sin actualización0 < $result
: Éxito
Salida de la clase
$wpdb->last_error
te mostrará el último error, si hubo alguno.$wpdb->last_query
te ayudará mostrando la última consulta (donde ocurrió el error). Es básicamente lo mismo quearray_pop( $wpbd->queries );
.
Nota importante (seguridad)
Por favor NO añadas estos códigos en un sitio en producción. Especialmente si hay plugins de caché involucrados. ¡Esto puede exponer datos importantes relacionados con la base de datos a los visitantes!
Si no puedes evitarlo: ¡siempre envuelve tu código en condicionales para evitar que la salida de depuración sea pública!
// Ejemplo
function debug_query( $result, $data )
{
global $current_user;
get_currentuserinfo();
if ( current_user_can( 'manage_options' ) )
{
global $wpdb, $blog_id;
1 !== $blog_id
AND ! defined( 'DIEONDBERROR' )
AND define( 'DIEONDBERROR', true );
$wpdb->show_errors = true;
$wpdb->suppress_errors = false;
$output = '<pre style="white-space:pre-line;">';
$output .= 'Último Error: ';
$output .= var_export( $wpdb->last_error, true );
$output .= "\n\nÚltima Consulta: ";
$output .= var_export( $wpdb->last_query, true );
if ( false === $result )
{
$result = new WP_Error( 'query_failed', 'Sin actualización.', $data );
}
elseif ( 0 === $result )
{
$result = new WP_Error( 'update_failed', 'Se actualizaron cero filas.', $data );
}
elseif ( 0 < $result )
{
$result = 'Éxito';
}
$output .= '</pre>';
// Solo abortar si hubo un error
is_wp_error( $result )
AND exit( $output.$result->get_error_message() );
}
}
¡Exponer el objeto $wpdb
también podría exponer tu nombre de usuario y contraseña de la base de datos!

Recomiendo ejecutar el siguiente código justo después de tu consulta para ver qué está sucediendo:
exit( var_dump( $wpdb->last_query ) );
Esto debería mostrar la última consulta que se ejecutó en tu base de datos. En casos como estos, suelo ejecutar manualmente dicha consulta a través de phpMyAdmin para verificar si se ejecuta sin errores y si realmente afecta a la base de datos. Además, al ver la consulta que realmente se ejecutó, podrías encontrar problemas en la consulta que resultan de tu código. Por ejemplo, la consulta podría no devolver ningún error de MySQL, pero podría estar ejecutando una consulta diferente a la que esperas. Con este código de depuración, al menos podrás ver qué está pasando y continuar con el maravilloso proceso de depuración. Adicionalmente, quizá quieras explorar más las "Variables de Clase" (Referencia del Codex) para $wpdb
ya que podrían ayudarte a solucionar tu problema.

Una respuesta cero significa que no se han afectado filas, lo cual es diferente a un error.
Es difícil determinar por qué no se actualizan las filas sin analizar tu consulta. Una herramienta de depuración que puedes probar es establecer "SAVEQUERIES
" en true en tu archivo wp-config.php.
Luego, después de que se ejecute tu consulta, intenta hacer un var_dump
de $wpdb->queries
.
