$ wpdb 업데이트 오류 표시


21

$wpdb->update데이터베이스에있는 사용자 지정 테이블을 업데이트하는 데 사용 하고 있습니다. var_dump결과가 반환 되면

int(0)

그래서 $wpdb->print_error()무엇이 잘못되었는지 보려고 했습니다. 그러나 아무것도 표시하지 않습니다. 나는 또한 시도 $wpdb->show_errors()했지만 다시는 아무것도 보이지 않았다.

wpdb의 문서는 내가 올바르게 사용하고 있다면 확실하지 오전하므로,이 기능을 사용하는 방법에 대한 많은 세부 사항에 가지 마세요. 그러나 왜 테이블 업데이트 결과가 0을 반환하고 오류가 표시되지 않습니까?

답변:


21

쿼리 직후에 다음 코드를 실행하여 현재 상황을 확인하는 것이 좋습니다.

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

데이터베이스에 발생한 마지막 쿼리를 인쇄해야합니다. 이런 경우에는 보통 phpMyAdmin을 통해 이러한 쿼리를 수동으로 실행하여 오류없이 실행되고 데이터베이스에 영향을 미치는지 확인합니다. 또한 실제로 실행 된 쿼리를 보면 코드에서 발생하는 쿼리에 문제가있을 수 있습니다. 예를 들어, 쿼리는 MySQL 오류를 반환하지 않을 수 있지만 예상 한 것과 다른 쿼리를 실행할 수 있습니다. 이 디버그 코드를 사용하면 최소한 그것이 무엇인지보고 멋진 디버그 추적을 계속할 수 있습니다! 또한 문제를 해결하는 데 도움이 될 수 있는 더 많은 "클래스 변수"( Codex Ref ) 를 탐색 $wpdb할 수 있습니다.


1
와우 이것을 찾고 있었다
K. Kilian Lindberg 13시

그것은 단지 SHOW FULL COLUMNS FROM `` 내 경우에 보여
Adi Prasetyo

22

오류 표시 :

  • $wpdb->show_errors = trueWP_DEBUG로 설정된 경우 오류가 자동으로 표시 됩니다 true.
  • $wpdb->suppress_errors = false 오류 억제를 중지합니다.

  • 다중 사이트에는 특별한 치료가 필요합니다

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

출력 처리

$wpdb->update()방법에는 세 가지 출력이 있습니다. 이를 확인하려면 var : 결과를 저장해야합니다 $result = $wpdb->update( /* ... */ );.

이러한 시나리오를 처리합니다.

  • false === $result: 실패
  • 0 === $result: 성공하지만 업데이트되지 않음
  • 0 < $result: 성공

클래스 출력

  • $wpdb->last_error 마지막 오류가 있으면 표시됩니다.
  • $wpdb->last_query마지막 쿼리 (오류가 발생한 위치)를 표시하는 데 도움이됩니다. 기본적으로와 동일합니다 array_pop( $wpbd->queries );.

중요 (보안) 참고

라이브 코드에는이 코드를 추가 하지 마십시오 . 특히 캐싱 플러그인이 관련된 경우에는 그렇지 않습니다. 중요한 DB 관련 데이터가 방문자에게 노출 될 수 있습니다 .

다른 방법으로 할 수없는 경우 : 항상 코드를 조건문으로 감싸서 공개 디버그 출력을 방지하십시오!

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

$wpdb객체를 노출하면 데이터베이스 사용자 이름과 비밀번호도 노출 될 수 있습니다!


1
이것은 멋진 답변입니다! 이것을 읽으면 WordPress Codex로 돌아가서 일반적으로 $ wpdb에 대해 더 많이 읽었습니다. 심층 답변에 다시 한번 감사드립니다.
clockwiseq

설명에서 굉장한 것 이상 ...
Vishal Kumar Sahu

4

응답이 0이면 행이 영향을받지 않으며 오류와 다릅니다.

행을 업데이트하지 않는 이유를 쿼리를 보지 않으면 말하기가 어렵습니다. 시도 할 수있는 디버그 도구 중 하나는 SAVEQUERIESwp-config.php 파일에서 " "를 true로 설정 하는 것입니다.

그런 다음 쿼리가 실행 된 var_dump후을 시도하십시오 $wpdb->queries.



2

쿼리하기 전에 이것을 시도하십시오.

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

또는 아마도 당신의 쿼리 후 :

if ($wpdb->last_error) {
  die('error=' . var_dump($wpdb->last_query) . ',' . var_dump($wpdb->error));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.