¿Por qué $wpdb->show_errors() y print_error() muestran una salida incluso si la salida de la consulta es correcta?

23 feb 2015, 12:18:45
Vistas: 111K
Votos: 15

Con el fin de investigar el siguiente problema, ver https://wordpress.stackexchange.com/questions/178995/sanitize-a-working-query-string-by-using-wpdb-prepare-fails-with-mysql-db-er me encontré con un comportamiento bastante extraño. Incluso cuando mi consulta utilizada era correcta y mostraba la salida correcta.

global $wpdb;
$wpdb->show_errors(); 
$pageposts = $wpdb->get_results( 
        $wpdb->prepare(
          "
          SELECT skposts.*
          FROM  $wpdb->posts skposts,
                $wpdb->postmeta skpostmeta1,
                $wpdb->postmeta skpostmeta2
          WHERE skposts.ID = skpostmeta1.post_id
            AND skposts.ID = skpostmeta2.post_id
            AND skpostmeta1.meta_key = %s
            AND skpostmeta2.meta_key = %s
            AND skposts.post_type = %s
            AND skposts.post_status = %s
          ORDER BY skpostmeta1.meta_value ASC,
                   skpostmeta2.meta_value ASC
          ", 
          'class_day',
          'class_start',
          'courses',
          'publish'
        )
, OBJECT
);
$wpdb->print_error();

Sin embargo, mientras tenga show_errors y print_error activos, obtengo una salida de error de la base de datos WP junto con:

WordPress database error: []
SELECT skposts.* FROM hmjtZ_posts skposts, hmjtZ_postmeta skpostmeta1, hmjtZ_postmeta skpostmeta2 WHERE skposts.ID = skpostmeta1.post_id AND skposts.ID = skpostmeta2.post_id AND skpostmeta1.meta_key = 'class_day' AND skpostmeta2.meta_key = 'class_start' AND skposts.post_type = 'courses' AND skposts.post_status = 'publish' ORDER BY skpostmeta1.meta_value ASC, skpostmeta2.meta_value ASC

¿Pero por qué? Hubiera esperado que se mostrara una salida solo si algo sale mal, como un error o advertencia, pero de esta manera se muestra algo todo el tiempo.

0
Todas las respuestas a la pregunta 1
2
34

El resultado que publicaste anteriormente es el comportamiento esperado para $wpdb->print_error() si se cumple lo siguiente:

  • Estás ejecutando un sitio único, no multisitio
  • $wpdb->suppress_errors está configurado como false
  • $wpdb->show_errors está configurado como false

Por lo que parece en tu código, cumples con todas esas condiciones.

Ten en cuenta también que, a menos que los hayas desactivado previamente, $wpdb->show_errors está configurado como true por defecto, por lo que no necesitas llamar a $wpdb->show_errors().

Para mostrar algo solo cuando hay un error en la base de datos, puedes hacer una de estas dos cosas:

1 - Mostrar el error y agregarlo al registro

Además de mostrarlo en pantalla, el método $wpdb->print_error() registrará tu error. Si este comportamiento es deseable (recomendado), puedes hacer esto:

if($wpdb->last_error !== '') :
    $wpdb->print_error();
endif;

2 - Mostrar el error pero no registrarlo

Si no estás interesado en registrar el error, puedes agregar tu propia función my_print_error() y usarla en lugar de $wpdb->print_error():

function my_print_error(){

    global $wpdb;

    if($wpdb->last_error !== '') :

        $str   = htmlspecialchars( $wpdb->last_result, ENT_QUOTES );
        $query = htmlspecialchars( $wpdb->last_query, ENT_QUOTES );

        print "<div id='error'>
        <p class='wpdberror'><strong>Error en la base de datos de WordPress:</strong> [$str]<br />
        <code>$query</code></p>
        </div>";

    endif;

}

Última edición: Error de sintaxis

23 feb 2015 13:51:29
Comentarios

Me devuelve vacío en $str y $query

User User
15 jul 2018 13:36:09

El mensaje de error está en $wpdb->last_error, no en $wpdb->last_result.

Martin_W Martin_W
12 dic 2018 05:04:09