PDO 오류 및 오류 처리

PDO는 애플리케이션 개발 스타일에 맞게 3가지 다른 오류 처리 전략을 선택할 수 있도록 합니다.

  • PDO::ERRMODE_SILENT

    PHP 8.0.0 이전에는 이것이 기본 모드였습니다. PDO는 명령문 및 데이터베이스 개체 모두에서 PDO::errorCode()PDO::errorInfo() 메서드를 사용하여 검사할 오류 코드를 간단히 설정합니다. 명령문 개체에 대한 호출로 인해 오류가 발생한 경우 해당 개체에서 PDOStatement::errorCode() 또는 PDOStatement::errorInfo() 메서드를 호출합니다. 오류가 데이터베이스 개체에 대한 호출로 인해 발생한 경우 대신 데이터베이스 개체에서 해당 메서드를 호출합니다.

  • PDO::ERRMODE_WARNING

    오류 코드를 설정하는 것 외에도 PDO는 전통적인 E_WARNING 메시지를 내보냅니다. 이 설정은 응용 프로그램의 흐름을 방해하지 않고 어떤 문제가 발생했는지 확인하려는 경우 디버깅/테스트 중에 유용합니다.

  • PDO::ERRMODE_EXCEPTION

    PHP 8.0.0부터 이것이 기본 모드입니다. 오류 코드를 설정하는 것 외에도 PDO는 PDOException을 발생시키고 해당 속성을 설정하여 오류 코드 및 오류 정보를 반영합니다. 이 설정은 오류 지점에서 스크립트를 효과적으로 "폭발"하여 코드의 잠재적인 문제 영역을 매우 빠르게 가리키므로 디버깅 중에도 유용합니다(기억: 예외가 발생하면 트랜잭션이 자동으로 롤백됩니다. 종료하는 스크립트).

    예외 모드는 또한 기존의 PHP 스타일 경고보다 더 명확하게 오류 처리를 구성할 수 있고 자동 모드에서 실행하고 각 데이터베이스 호출의 반환 값을 명시적으로 확인하는 것보다 적은 코드/중첩으로 구성할 수 있기 때문에 유용합니다.

    PHP의 예외에 대한 자세한 내용은 Exceptions를 참조하십시오.

PDO는 SQL-92 SQLSTATE 오류 코드 문자열을 사용하여 표준화합니다. 개별 PDO 드라이버는 고유 코드를 적절한 SQLSTATE 코드에 매핑하는 역할을 합니다. PDOStatement::errorCode() 메소드는 단일 SQLSTATE 코드를 리턴합니다. 오류에 대한 보다 구체적인 정보가 필요한 경우 PDO는 SQLSTATE 코드, 드라이버별 오류 코드 및 드라이버별 오류 문자열이 포함된 배열을 반환하는 PDOStatement::errorInfo() 메서드도 제공합니다.

예제 #1 PDO 인스턴스 생성 및 오류 모드 설정

                  
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

?>
                  
                

메모: PDO::__construct()는 현재 설정된 PDO::ATTR_ERRMODE에 관계없이 연결이 실패하면 항상 PDOException을 발생시킵니다. 잡히지 않은 예외는 치명적입니다.

예제 #2 PDO 인스턴스 생성 및 생성자에서 오류 모드 설정

                  
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';

/*
    Using try/catch around the constructor is still valid even though we set the ERRMODE to WARNING since
    PDO::__construct will always throw a PDOException if the connection fails.
*/
try {
    $dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    exit;
}

// This will cause PDO to throw an error of level E_WARNING instead of an exception (when the table doesn't exist)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>
                  
                

위의 예는 다음을 출력합니다.

Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in
/tmp/pdo_test.php on line 18