PDO는 다양한 애플리케이션 개발 스타일을 충족하기 위해 세 가지 오류 처리 모드를 제공합니다.
PDO::ERRMODE_SILENT 이는 기본 모드입니다. PDO는 단순히 오류 코드를 설정하며 이는 명령문 및 데이터베이스 개체에 대한 PDO::errorCode() 및 PDO::errorInfo() 메서드를 사용하여 확인할 수 있습니다. 명령문 객체 호출로 인해 오류가 발생하는 경우 해당 객체의 PDOStatement::errorCode() 또는 PDOStatement::errorInfo() 메서드를 호출할 수 있습니다. 데이터베이스 개체를 호출하여 오류가 발생한 경우 데이터베이스 개체에 대해 위의 두 메서드를 호출할 수 있습니다.
PDO::ERRMODE_WARNING 오류 코드 설정 외에도 PDO는 기존 E_WARNING 메시지도 보냅니다. 이 설정은 애플리케이션 흐름을 방해하지 않고 무엇이 잘못되었는지 확인하려는 경우 디버깅/테스트 중에 유용합니다.
PDO::ERRMODE_EXCEPTION PDO는 오류 코드 설정 외에도 PDOException 예외 클래스를 발생시키고 해당 속성을 설정하여 오류 코드 및 오류 정보를 반영합니다. 이 설정은 디버깅 중에도 매우 유용합니다. 오류가 발생한 스크립트 지점을 효과적으로 확대하여 코드에서 잠재적인 문제가 있는 영역을 매우 빠르게 찾아낼 수 있기 때문입니다. (기억: 예외로 인해 스크립트가 종료되면 트랜잭션은 자동으로 롤백됩니다.
예외 모드의 또 다른 매우 유용한 점은 기존 PHP 스타일 경고보다 더 명확하게 자체 오류 처리를 구축할 수 있다는 점이며, 자동 모드 및 각 데이터베이스 호출의 반환 값을 명시적으로 확인하는 것과 비교하면 예외 패턴에 필요한 요구 사항이 더 적습니다. 코드/중첩.
PDO는 SQL-92 SQLSTATE를 사용하여 오류 코드 문자열을 정규화합니다. 다양한 PDO 드라이버는 기본 코드를 적절한 SQLSTATE 코드에 매핑합니다. PDO::errorCode() 메소드는 단일 SQLSTATE 코드를 리턴합니다. 이 오류에 대한 자세한 정보가 필요한 경우 PDO는 SQLSTATE 코드, 특정 드라이버 오류 코드 및 이 드라이버의 오류 문자열이 포함된 배열을 반환하는 PDO::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::ATTR_ERRMODE가 설정되어 있는지 여부에 관계없이 연결이 실패하면 PDO::__construct()는 항상 PDOException 예외를 발생시킵니다. 잡히지 않는 예외는 치명적입니다.
예제 #2 PDO 인스턴스를 생성하고 생성자에서 오류 모드를 설정합니다.
<?php $dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = 'googleguy'; $password = 'googleguy'; /* *使用 try/catch 围绕构造函数仍然有效,即使设置了 ERRMODE 为 WARNING, *因为如果连接失败,PDO::__construct 将总是抛出一个 PDOException 异常。 */ try { $dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); exit; } // 这里将导致 PDO 抛出一个 E_WARNING 级别的错误,而不是 一个异常 (当数据表不存在时) $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