¿Por qué dbDelta () no captura MysqlErrors?

3

Por lo que puedo ver, dbDelta() está diseñado para suprimir los errores de base de datos que ocurren durante su operación. En general, este parece ser el caso, pero New Relic sigue informando MysqlErrors de la función. El mensaje de error exacto es del formato:

MysqlError: Table 'xxx.wp_yyy_posts' doesn't exist

Desde dbDelta() en /wp-admin/includes/upgrade.php , tenemos:

// Fetch the table column structure from the database
$suppress = $wpdb->suppress_errors();
$tablefields = $wpdb->get_results("DESCRIBE {$table};");
$wpdb->suppress_errors( $suppress );

Parece que suppress_errors() está haciendo su trabajo y evita que los mensajes de error se muestren en la pantalla. Sin embargo, también parece que estos errores no se están manejando realmente, como lo demuestra nuestra instalación de New Relic.

Comprensiblemente, nos gustaría eliminar todas las posibles fuentes de errores en nuestra aplicación de producción para que podamos usar con precisión la herramienta New Relic para rastrear las tasas de error reales y asociarlas con las herramientas de informes de New Relic.

¿Existe alguna razón convincente por la que dbDelta() no maneje este error? La única razón por la que puedo pensar es que esta es una decisión de diseño deliberada para facilitar el desarrollo y la solución de errores. Podría ser difícil para un desarrollador rastrear problemas cuando dbDelta() suprime completamente cualquier error. Por supuesto, se podría introducir un nuevo parámetro / opción para especificar si esta supresión automática de errores debería ocurrir o no (lo que haría que la captura del MysqlError sea una tarea fácil).

Esto se convierte en un pequeño problema en nuestro caso en el que cada llamada a install_blog() genera este error. Dado que estamos ejecutando una gran instalación multisitio, cada vez que creamos un nuevo blog, se genera un error.

    
pregunta rinogo 21.04.2014 - 20:38

2 respuestas

1

Como mencionó @Charleston Software Associates, la consulta DESCRIBE no debería ejecutarse si la tabla no existe. La mejor solución, como señaló, es evitar que ocurra el error en primer lugar.

Para hacerlo, parche wp-admin/includes/upgrade.php de la siguiente manera:

Cambie la siguiente línea desde dbDelta ():

  $tablefields = $wpdb->get_results("DESCRIBE {$table};”);

a:

    //Begin core hack - See http://wordpress.stackexchange.com/q/141971/10388
    $check_table = $wpdb->get_results("SHOW TABLES LIKE '".str_replace("_", "\_", $table)."';");
    if(!empty($check_table))
        $tablefields = $wpdb->get_results("DESCRIBE {$table};");
    else
        $tablefields = null;
    //End core hack

Esta no es la solución más limpia (especialmente porque es un hack del núcleo), ¡pero funciona para mí, al menos! Quizás ayude a alguien más.

ACTUALIZACIÓN: ver mi comentario a continuación. (Esto no resuelve completamente el problema, aunque es un paso en la dirección correcta)

    
respondido por el rinogo 03.11.2014 - 20:05
0

Los errores de DB de ese tipo solo deben aparecer en la interfaz de usuario si DB_DEBUG está habilitado. En un sistema de producción que debe ser deshabilitado. Debería encontrar esa configuración en el archivo wp-config.php para su instalación de WP.

Puede intentar forzar manualmente los errores a "ocultar" restableciendo el EZSQL_ERROR global. Este es mi truco personal y, probablemente, no se recomiende ni se recomienda para trabajar con dbDelta:

/**
 * Update the data structures on new db versions.
 *
 * @global object $wpdb
 * @param type $sql
 * @param type $table_name
 * @return string
 */
function dbupdater($sql,$table_name) {
    global $wpdb;
    $retval = ( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name ) ? 'new' : 'updated';

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    $were_showing_errors = $wpdb->show_errors;
    $wpdb->hide_errors();
    dbDelta($sql);
    global $EZSQL_ERROR;
    $EZSQL_ERROR=array();
    if ( $were_showing_errors ) {
        $wpdb->show_errors();
    }

    return $retval;
}
    
respondido por el Lance Cleveland 21.04.2014 - 23:58

Lea otras preguntas en las etiquetas