Mostrar errores con la actualización de $ wpdb

21

Estoy usando $wpdb->updatepara actualizar una tabla personalizada que tengo en mi base de datos. Cuando me var_dumpdevuelve el resultado:

int(0)

Así que traté $wpdb->print_error()de ver qué pasa. Sin embargo, no muestra nada. También lo intenté $wpdb->show_errors(), pero nuevamente no mostró nada.

Los documentos de wpdb no detallan mucho sobre cómo usar estas funciones, por lo que no estoy seguro de si las estoy usando correctamente. Pero, ¿por qué el resultado de actualizar una tabla devuelve 0 y no muestra ningún error?

Jarred
fuente

Respuestas:

21

Recomendaría ejecutar el siguiente código justo después de su consulta para ver qué sucede:

exit( var_dump( $wpdb->last_query ) );

Esto debería imprimir la última consulta que golpeó su base de datos. En casos como estos, generalmente ejecutaré manualmente tal consulta a través de phpMyAdmin para ver si se ejecuta sin errores y para ver si incluso afecta la base de datos. Además, al ver la consulta que realmente se ejecutó, puede encontrar problemas en la consulta que resulta de su código. Por ejemplo, la consulta puede no devolver ningún error de MySQL, pero podría ejecutar una consulta que sea diferente de lo que espera que sea. ¡Con este código de depuración, al menos podrás ver qué es y continuar en el maravilloso rastro de depuración! Además, es posible que desee explorar más de las "Variables de clase" ( Ref. Codex ) $wpdbya que pueden ayudarlo a resolver su problema.

tollmanz
fuente
1
Wow estado buscando esto
K. Kilian Lindberg
solo se muestra SHOW FULL COLUMNS FROM `` en mi caso
Adi Prasetyo
22

Mostrar errores:

  • $wpdb->show_errors = truemuestra errores automáticamente, si WP_DEBUGestá configurado en true.
  • $wpdb->suppress_errors = false deja de suprimir errores.

  • Multisitio necesita tratamiento especial

    // Show errors in Multisite:
    global $wpdb, $blog_id;
    // There's no is_multisite(), so we need to check the ID
    // This means, that we can't debug the blog with the ID 1 as MU-blog by default
    // Check if we are on Blog ID#1 and if not, check the defines and add error handling
    if ( 1 !== $blog_id )
        ! defined( 'DIEONDBERROR' ) AND define( 'DIEONDBERROR', true );

Manejo de salida

El $wpdb->update()método tiene tres salidas diferentes. Para comprobar su contra, debe guardar el resultado ia var: $result = $wpdb->update( /* ... */ );.

El manejo de esos escenarios:

  • false === $result: Fallar
  • 0 === $result: Éxito, pero sin actualización
  • 0 < $result: Éxito

Salida de clase

  • $wpdb->last_error le mostrará el último error, si tiene uno.
  • $wpdb->last_queryle ayudará a mostrar la última consulta (donde ocurrió el error). Es básicamente lo mismo que array_pop( $wpbd->queries );.

Nota importante (seguridad)

Por favor, NO añadir estos códigos en el sitio en vivo. Especialmente no si los complementos de almacenamiento en caché están involucrados. ¡Esto puede exponer datos importantes relacionados con DB a los visitantes !

Si no puede hacer lo contrario: ¡siempre envuelva su código en declaraciones condicionales para evitar la salida de depuración de cara al público!

// Example
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 .= 'Last Error: ';
            $output .= var_export( $wpdb->last_error, true );

            $output .= "\n\nLast Query: ";
            $output .= var_export( $wpdb->last_query, true );

            if ( false === $result )
            {
                $result = new WP_Error( 'query_failed', 'No update.', $data );
            }
            elseif ( 0 === $result )
            {
                $result = new WP_Error( 'update_failed', 'Updated zero rows.', $data );
            }
            elseif ( 0 < $result )
            {
                $result = 'Success';
            }
        $output .= '</pre>';

        // Only abort, if we got an error
        is_wp_error( $result ) 
            AND exit( $output.$result->get_error_message() );
    }
}

¡Exponer el $wpdbobjeto también puede exponer su nombre de usuario y contraseña de la base de datos!

emperador
fuente
1
¡Esta es una respuesta increíble! Leer esto me hizo volver al Codex de WordPress y leer más sobre $ wpdb en general. Gracias de nuevo por la respuesta en profundidad.
clockwiseq
Más que impresionante en la explicación ...
Vishal Kumar Sahu
4

Una respuesta cero significa cero filas afectadas, que es diferente de un error.

Es difícil decir sin mirar su consulta por qué no se están actualizando filas. Una herramienta de depuración que puedes probar es establecer " SAVEQUERIES" en verdadero en tu archivo wp-config.php.

A continuación, después de que su consulta se ejecuta, intente var_dumping $wpdb->queries.

goldenapples
fuente
3
$wpdb->show_errors();
$wpdb->print_error();
Emil
fuente
2

Pruebe esto antes de su consulta:

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

o tal vez esto después de su consulta:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
Volomike
fuente