Mostrando errores con la actualización de $wpdb

5 may 2011, 04:42:02
Vistas: 53.6K
Votos: 27

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?

0
Todas las respuestas a la pregunta 5
2
28

Mostrar errores:

  • $wpdb->show_errors = true muestra errores automáticamente, si WP_DEBUG está configurado como true.
  • $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ón
  • 0 < $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 que array_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!

12 ago 2011 21:22:47
Comentarios

¡Esta es una respuesta increíble! Leer esto me hizo volver al Codex de WordPress y leer más sobre $wpdb en general. Gracias nuevamente por la respuesta tan detallada.

clockwiseq clockwiseq
7 jun 2015 19:33:18

Más que increíble en la explicación...

Vishal Kumar Sahu Vishal Kumar Sahu
2 abr 2017 22:39:53
2
26

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.

5 may 2011 08:02:53
Comentarios

Guau, llevaba tiempo buscando esto

K. Kilian Lindberg K. Kilian Lindberg
19 mar 2014 15:36:41

en mi caso solo muestra SHOW FULL COLUMNS FROM ``

Adi Prasetyo Adi Prasetyo
26 feb 2019 07:50:58
0

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.

5 may 2011 05:28:08
0
$wpdb->show_errors(); // Mostrar errores de la base de datos
$wpdb->print_error();  // Imprimir mensajes de error
2 mar 2012 18:04:03
0

Prueba esto antes de tu consulta:

$wpdb->show_errors = TRUE;
$wpdb->suppress_errors = FALSE;

o quizás esto después de tu consulta:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
16 abr 2012 22:21:45