Mostrando erros com a atualização $ wpdb

21

Estou usando $wpdb->updatepara atualizar uma tabela personalizada que tenho no meu banco de dados. Quando var_dumpo resultado retorna:

int(0)

Então tentei $wpdb->print_error()ver o que havia de 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, portanto, não tenho certeza se estou usando-as corretamente. Mas por que o resultado da atualização de uma tabela retornaria 0 e não mostraria erros?

Jarred
fonte

Respostas:

21

Eu recomendaria executar o seguinte código logo após a sua 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 verificar se ela é executada sem erros e se afeta o banco de dados. Além disso, vendo a consulta que foi realmente executada, você pode encontrar problemas na consulta resultante do seu código. Por exemplo, a consulta pode não retornar nenhum erro do MySQL, mas pode executar uma consulta diferente do que você espera. Com esse código de depuração, você poderá pelo menos ver o que é e continuar na maravilhosa trilha de depuração! Além disso, convém explorar mais as "Variáveis ​​de classe" ( referência do codex ), $wpdbpois elas podem ajudar a solucionar ainda mais o problema.

tollmanz
fonte
1
Uau sido olhando para este
K. Kilian Lindberg
apenas mostra SHOW FULL COLUMNS FROM `` no meu caso
Adi Prasetyo 26/02
22

Mostrar erros:

  • $wpdb->show_errors = truemostra erros automaticamente, se WP_DEBUGestiver definido comotrue .
  • $wpdb->suppress_errors = false pára de suprimir erros.

  • Multissite 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 );

Manuseio de saída

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

O lidar com esses cenários:

  • false === $result: Falhou
  • 0 === $result: Sucesso, mas nenhuma atualização
  • 0 < $result: Sucesso

Saída de classe

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

Nota importante (segurança)

Por favor, não adicione códigos no local ao vivo. Especialmente se plugins de cache estiverem envolvidos. Isso pode expor dados importantes relacionados ao banco de dados para os visitantes !

Se você não pode 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() );
    }
}

A exposição do $wpdbobjeto também pode expor o nome de usuário e a senha do banco de dados!

kaiser
fonte
1
Esta é uma resposta incrível! A leitura disso me fez voltar ao Codex do WordPress e ler mais sobre o $ wpdb em geral. Mais uma vez obrigado pela resposta detalhada.
clockwiseq
Mais do que impressionante na explicação ...
Vishal Kumar Sahu
4

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

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

Então, depois de suas corridas de consulta, tente var_dumping $wpdb->queries.

maçãs douradas
fonte
3
$wpdb->show_errors();
$wpdb->print_error();
Emil
fonte
2

Tente isso antes da sua consulta:

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

ou talvez depois da sua consulta:

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