복붙노트

PDO PHP에서 쿼리 오류를 보는 방법

PHP

PDO PHP에서 쿼리 오류를 보는 방법

try {
    $db = new PDO("mysql:host=".HOST.";dbname=".DB, USER, PW);
    $st = $db->prepare("SELECT * FROM c6ode");
}
catch (PDOException $e){
    echo $e->getMessage();
}

어떻게 위의 경우 쿼리에 대한 MySQL의 오류를 확인할 수 있습니까?

해결법

  1. ==============================

    1.오류 모드 속성 PDO :: ATTR_ERRMODE를 PDO :: ERRMODE_EXCEPTION으로 설정해야합니다. 그리고 prepare () 메소드에 의해 예외가 발생할 것으로 예상되므로 PDO :: ATTR_EMULATE_PREPARES * 기능을 비활성화해야합니다. 그렇지 않으면 MySQL 서버는 실행될 때까지 명령문을 "보지"않습니다.

    오류 모드 속성 PDO :: ATTR_ERRMODE를 PDO :: ERRMODE_EXCEPTION으로 설정해야합니다. 그리고 prepare () 메소드에 의해 예외가 발생할 것으로 예상되므로 PDO :: ATTR_EMULATE_PREPARES * 기능을 비활성화해야합니다. 그렇지 않으면 MySQL 서버는 실행될 때까지 명령문을 "보지"않습니다.

    <?php
    try {
        $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    
        $pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');
    }
    catch(Exception $e) {
        echo 'Exception -> ';
        var_dump($e->getMessage());
    }
    

    지문 (내 경우)

    Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found: 
    1146 Table 'test.doesnotexist' doesn't exist"
    

    http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/을 참조하십시오. EMULATE_PREPARES = true가 pdo_mysql 드라이버의 기본 설정 인 것 같습니다. 쿼리 캐시 문제는 그 이후로 수정되었지만 mysqlnd 드라이버를 사용하면 EMULATE_PREPARES = false와 문제가 없었습니다 (PHP 애호가 일 뿐이므로 내 말을 듣지 마십시오 ...)

    *) 그리고 나서 PDO :: MYSQL_ATTR_DIRECT_QUERY가 있습니다 - 두 속성의 상호 작용을 아직 이해하지 못했음을 인정해야합니다.

    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
        PDO::ATTR_EMULATE_PREPARES=>false,
        PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
        PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
    ));
    
  2. ==============================

    2.추가 설정없이 이것을 사용하고 있습니다.

    추가 설정없이 이것을 사용하고 있습니다.

    if (!$st->execute()) {
        print_r($st->errorInfo());
    }
    
  3. ==============================

    3.귀하의 불만은 예외가 발사되지 않는다고 생각합니다. PDO는 대부분 예외를 발생시키지 않도록 구성됩니다. 다음과 같이 활성화하십시오.

    귀하의 불만은 예외가 발사되지 않는다고 생각합니다. PDO는 대부분 예외를 발생시키지 않도록 구성됩니다. 다음과 같이 활성화하십시오.

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    
  4. ==============================

    4.테스트 중 오류를 빠르게 볼 수있는 방법 :

    테스트 중 오류를 빠르게 볼 수있는 방법 :

    $error= $st->errorInfo();
    echo $error[2];
    
  5. ==============================

    5./ * 오류 발생 - BONES 테이블이 존재하지 않습니다. * /

    / * 오류 발생 - BONES 테이블이 존재하지 않습니다. * /

    $sth = $dbh->prepare('SELECT skull FROM bones');
    $sth->execute();
    
    echo "\nPDOStatement::errorInfo():\n";
    $arr = $sth->errorInfo();
    print_r($arr);
    

    산출

    Array
    (
        [0] => 42S02
        [1] => -204
        [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N  "DANIELS.BONES" is an undefined name.  SQLSTATE=42704
    )
    
  6. ==============================

    6.이 오류가 발생하면 나를 위해이 작품 :

    이 오류가 발생하면 나를 위해이 작품 :

    치명적인 오류 : 정의되지 않은 메서드를 호출 mysqli :: error ()

    if(! empty( $db->error ) ){
       echo $db->error;  // <- this is not a function call error()
    }
    

    https://stackoverflow.com/a/32045823

  7. from https://stackoverflow.com/questions/8776344/how-to-view-query-error-in-pdo-php by cc-by-sa and MIT license