Mostrando erros com a atualização $ wpdb

17

Estou usando $wpdb->update para atualizar uma tabela personalizada que tenho em meu banco de dados. Quando eu var_dump o resultado retorna:

int(0)

Então, eu tentei $wpdb->print_error() para ver o que está errado. No entanto, isso não mostra nada. Eu também tentei $wpdb->show_errors() , mas novamente não mostrou nada.

Os documentos do wpdb não entram em muitos detalhes sobre como usar essas funções, por isso não tenho certeza se eu estou usando-os corretamente. Mas por que o resultado de atualizar uma tabela retornaria 0 e não mostraria erros?

    
por Jarred 05.05.2011 / 03:42

5 respostas

16

Eu recomendaria a execução do seguinte código logo após a consulta para ver o que está acontecendo:

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

Isso deve imprimir a última consulta que atingiu seu banco de dados. Em casos como esses, normalmente executarei manualmente essa consulta através do phpMyAdmin para ver se ele é executado sem erros e para ver se ele afeta o banco de dados. Além disso, ao ver a consulta que foi realmente executada, você pode encontrar problemas na consulta que resulta do seu código. Por exemplo, a consulta pode não retornar erros do MySQL, mas pode executar uma consulta diferente da esperada. Com este código de depuração, você poderá ao menos ver o que é e continuar na maravilhosa trilha de depuração! Além disso, você pode querer explorar mais as "Class Variables" ( Codex Ref ) para $wpdb como elas pode ajudar ainda mais a solucionar seu problema.

    
por tollmanz 05.05.2011 / 07:02
19

Mostrar erros:

  • $wpdb->show_errors = true mostra erros automaticamente, se WP_DEBUG estiver definido como true .
  • $wpdb->suppress_errors = false pára de suprimir erros.

  • Multisite precisa de tratamento 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 );
    

Processamento de saída

O método $wpdb->update() tem três saídas diferentes. Para verificar isso, você deve salvar o resultado em um var: $result = $wpdb->update( /* ... */ ); .

O identificador desses cenários:

  • false === $result : falha
  • 0 === $result : sucesso, mas sem atualização
  • 0 < $result : sucesso

Saída de classe

  • $wpdb->last_error mostrará o último erro, se você tiver um.
  • $wpdb->last_query irá ajudá-lo a mostrar a última consulta (onde o erro ocorreu). É basicamente o mesmo que array_pop( $wpbd->queries ); .

Importante (segurança) Nota

Por favor, NÃO adicione estes códigos no site em direto. Especialmente se plugins de cache estiverem envolvidos. Isso pode expor dados importantes relacionados ao banco de dados aos visitantes !

Se você não puder fazer o contrário: sempre envolva seu código em instruções condicionais para evitar saída de depuração voltada para o 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() );
    }
}

Expor o objeto $wpdb também pode expor seu nome de usuário e senha do banco de dados!

    
por kaiser 12.08.2011 / 20:22
4

Uma resposta zero significa zero linhas afetadas, o que é diferente de um erro.

É difícil dizer sem consultar sua consulta por que nenhuma linha está sendo atualizada. Uma ferramenta de depuração que você pode tentar é definir " SAVEQUERIES " como true em seu arquivo wp-config.php.

Depois que sua consulta for executada, tente var_dump ing $wpdb->queries .

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

Tente isso antes da sua consulta:

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

ou talvez isso depois da sua consulta:

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
    
por Volomike 16.04.2012 / 21:21

Tags