PDO::errorInfo
데이터베이스 핸들에서 최근 작업의 확장된 오류 정보를 검색합니다.
구문
array PDO::errorInfo();
Return Value
데이터베이스 핸들에서 최근 작업에 대한 오류 정보입니다. 배열은 다음 필드로 구성됩니다.
SQLSTATE 오류 코드입니다.
드라이버별 오류 코드입니다.
드라이버별 오류 메시지입니다.
오류가 없거나 SQLSTATE가 설정되지 않은 경우 드라이버 관련 필드는 NULL입니다.
설명
PDO::errorInfo는 데이터베이스에서 직접 수행된 작업에 대한 오류 정보만 검색합니다. PDO::prepare 또는 PDO::query를 사용하여 PDOStatement 인스턴스가 만들어질 때 PDOStatement::errorInfo를 사용합니다.
PDO 지원이 Microsoft Drivers for PHP for SQL Server의 버전 2.0에 추가되었습니다.
예제
이 예제에서는 열 이름의 철자가 잘못되어(City
가 아닌 Cityx
) 오류가 발생하므로 보고됩니다.
<?php
$conn = new PDO( "sqlsrv:server=(local) ; Database = AdventureWorks ", "");
$query = "SELECT * FROM Person.Address where Cityx = 'Essen'";
$conn->query($query);
print $conn->errorCode();
echo "\n";
print_r ($conn->errorInfo());
?>
추가 ODBC 메시지
예외가 발생하면 ODBC Driver는 문제를 진단하는 데 도움이 되는 두 개 이상의 오류를 반환할 수 있습니다. 그러나 PDO::errorInfo는 항상 첫 번째 오류만 표시합니다. 관련 버그 신고서에 대한 응답으로 드라이버가 ‘최소한’ 다음 세 필드를 표시해야 함을 나타내도록 PDO::errorInfo 및 PDOStatement::errorInfo가 업데이트되었습니다.
0 SQLSTATE error code (a five characters alphanumeric identifier defined in the ANSI SQL standard).
1 Driver specific error code.
2 Driver specific error message.
5\.9.0부터 PDO::errorInfo의 기본 동작은 추가 ODBC 오류를 표시하는 것입니다(사용 가능한 경우). 예를 들면 다음과 같습니다.
<?php
try {
$conn = new PDO("sqlsrv:server=$server;", $uid, $pwd);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SET NOCOUNT ON; USE $database; SELECT 1/0 AS col1");
$stmt->execute();
} catch (PDOException $e) {
var_dump($e->errorInfo);
}
?>
위의 스크립트를 실행하면 예외가 throw되고 출력은 다음과 같습니다.
array(6) {
[0]=>
string(5) "01000"
[1]=>
int(5701)
[2]=>
string(91) "[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to 'tempdb'."
[3]=>
string(5) "22012"
[4]=>
int(8134)
[5]=>
string(87) "[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Divide by zero error encountered."
}
사용자가 이전 방법을 선호하는 경우 새 구성 옵션 pdo_sqlsrv.report_additional_errors
를 사용하여 해제할 수 있습니다. php 스크립트의 시작 부분에 다음 줄을 추가하면 됩니다.
ini_set('pdo_sqlsrv.report_additional_errors', 0);
이 경우, 동일한 예제 스크립트를 실행할 때 다음과 같은 오류 정보가 표시됩니다.
array(3) {
[0]=>
string(5) "01000"
[1]=>
int(5701)
[2]=>
string(91) "[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to 'tempdb'."
}
필요하면 사용자는 php 파일에 다음 줄을 추가하여 모든 php 스크립트에서 이 기능을 해제할 수 있습니다.
pdo_sqlsrv.report_additional_errors = 0
경고 및 오류
5\.9.0부터 ODBC 경고는 더 이상 오류로 로그되지 않습니다. 즉, “01” 접두사가 있는 오류 코드가 경고로 로그됩니다. 즉, 사용자가 오류만 로그하고자 하는 경우 다음과 같이 php를 업데이트합니다.
[pdo_sqlsrv]
pdo_sqlsrv.log_severity = 1
이 경우 로그 파일에는 경고 메시지가 포함되지 않습니다. Pdo_sqlsrv 사용자에 대해 로깅이 작동하는 방식을 확인하세요.