Mostrando errores con la actualización de $ wpdb

17

Estoy usando $wpdb->update para actualizar una tabla personalizada que tengo en mi base de datos. Cuando var_dump el resultado devuelve:

int(0)

Entonces intenté $wpdb->print_error() para ver qué está mal. Sin embargo, no muestra nada. También probé $wpdb->show_errors() , pero de nuevo no mostró nada.

El wpdb docs no entra en mucho detalle sobre cómo usar estas funciones, así que no estoy seguro. Si los estoy usando correctamente. Pero, ¿por qué el resultado de actualizar una tabla devuelve 0 y no muestra ningún error?

    
pregunta Jarred 05.05.2011 - 03:42

5 respuestas

16

Recomendaría ejecutar el siguiente código inmediatamente 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 ejecuto manualmente una consulta de este tipo a través de phpMyAdmin para ver si se ejecuta sin errores y para ver si afecta incluso a la base de datos. Además, al ver la consulta que realmente se ejecutó, puede encontrar problemas en la consulta que resultan de su código. Por ejemplo, es posible que la consulta no devuelva ningún error de MySQL, pero podría ejecutar una consulta que sea diferente a la que usted espera. 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" ( Codex Ref ) para $wpdb como puede ayudar a solucionar aún más su problema.

    
respondido por el tollmanz 05.05.2011 - 07:02
19

Mostrar errores:

  • $wpdb->show_errors = true muestra los errores automáticamente, si WP_DEBUG se establece en true .
  • $wpdb->suppress_errors = false deja de suprimir los errores.

  • Multisite 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 método $wpdb->update() tiene tres salidas diferentes. Para verificarlo, debe guardar el resultado en una var: $result = $wpdb->update( /* ... */ ); .

El manejo de esos escenarios:

  • false === $result : Fail
  • 0 === $result : éxito, pero ninguna actualización
  • 0 < $result : éxito

Salida de clase

  • $wpdb->last_error le mostrará el último error, si obtuvo uno.
  • $wpdb->last_query lo 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 agregue estos códigos en el sitio en vivo. Especialmente no si se trata de complementos de caché. Esto puede exponer datos importantes relacionados con la base de datos a los visitantes !

Si no puede hacer lo contrario: ¡siempre ajuste su código en sentencias condicionales para evitar que el público salga de la depuración!

// 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() );
    }
}

La exposición del objeto $wpdb también puede exponer el nombre de usuario y la contraseña de su base de datos.

    
respondido por el kaiser 12.08.2011 - 20:22
4

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

Es difícil decirlo sin mirar su consulta por qué no se actualizan filas. Una herramienta de depuración que puedes probar es configurar " SAVEQUERIES " en true en tu archivo wp-config.php.

Luego, una vez que se ejecuta la consulta, intente var_dump ing $wpdb->queries .

    
respondido por el goldenapples 05.05.2011 - 04:28
3
$wpdb->show_errors();
$wpdb->print_error();
    
respondido por el Emil 02.03.2012 - 17:04
2

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));
}
    
respondido por el Volomike 16.04.2012 - 21:21

Lea otras preguntas en las etiquetas