developer tip

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

optionbox 2020. 11. 24. 07:53
반응형

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 오류를 어떻게 확인할 수 있습니까?


오류 모드 속성 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 = 사실은 지금 pdo_mysql 드라이버의 기본 설정 될 것으로 보인다. 쿼리 캐시는 그 이후로 수정 / 변경되었으며 mysqlnd 드라이버를 사용하면 EMULATE_PREPARES = false에 문제가 없었습니다.

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

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

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

귀하의 불만은 예외가 발생하지 않는다는 것입니다. PDO는 예외를 발생시키지 않도록 구성되었을 가능성이 높습니다. 다음과 같이 활성화하십시오.

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

테스트하는 동안 오류를 확인하는 빠른 방법 :

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

/ * 오류 유발-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
)

이 오류가 발생하면 나를 위해 작동합니다.

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

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

https://stackoverflow.com/a/32045823

참고 URL : https://stackoverflow.com/questions/8776344/how-to-view-query-error-in-pdo-php

반응형