Урок - Режимы обработки ошибок в PDO

Главная » Курсы » Курс PHP5, PDO - PHP Data Objects » Урок - Режимы обработки ошибок в PDO

Обучающий онлайн курс
PHP5, PDO - PHP Data Objects

Лицензия: Копирование запрещено.

Режимы обработки ошибок

PDO предлагает выбор из 3 различных стратегий обработки ошибок, для соответствия вашему стилю разработки приложений.

  • PDO::ERRMODE_SILENT - Это режим по умолчанию. PDO просто установит код ошибки.
  • PDO::ERRMODE_WARNING - В дополнение к установке кода ошибки, PDO будет выдавать традиционное сообщение E_WARNING.
  • PDO::ERRMODE_EXCEPTION - В дополнение к установке кода ошибки, PDO будет выбрасывать исключение PDOException и задаст его свойства, чтобы отразить код ошибки и саму ошибку.

Изменение режима обработки ошибок:

При создании соединения:

$pdoAttributes = array(
	PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
);
$pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD, $pdoAttributes);		

В созданном соединении:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);		

Режим обработки ошибок PDO::ERRMODE_SILENT

PDO::ERRMODE_SILENT - Это режим по умолчанию. PDO просто установит код ошибки, чтобы проверить используя методы PDO::errorCode() и PDO::errorInfo() или PDOStatement::errorCode() и PDOStatement::errorInfo().

Если ошибка произошла в результате вызова запроса, вы должны использовать методы PDOStatement::errorCode() или PDOStatement::errorInfo() для объекта запроса.

$sql = $pdo->prepare("SELECT * FROM `unknown_table`");
$sql->execute();
echo "PDOStatement::errorCode(): ";
print $sql->errorCode();		

Результат:

PDOStatement::errorCode(): 42S02		

Если ошибка произошла в результате вызова объекта базы данных, вы должны вызвать методы объекта базы данных PDO::errorCode() и PDO::errorInfo().

$sql = $pdo->exec("SELECT * FROM `unknown_table`");
echo "PDO::errorCode(): ";
print $pdo->errorCode();		

Результат:

 

PDO::errorCode(): 42S02

 

Важный момент!!

При возникновении ошибки на этапе создания соединения PDO выбрасывает исключение PDOException, а не ошибку или сообщение E_WARNING:

define('PDO_DSN', 'mysql:dbname=test;host=127.0.0.1');
define('PDO_USERNAME', 'root');
define('PDO_PASSWORD', 'не правильный пароль');

$pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD);		

Таким образом, что бы обработать ошибку соединения необходимо заключить вызов в оператор try..catch:

try{
	$pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD);
	//	код
}catch(Exception $e){
	echo 'Error!';
}		

Результат:

Error!		

PDO использует стандарт SQL-92 SQLSTATE строк кода ошибки; отдельные драйверы PDO отвечают за отображение в родном коде в соответствующие коды SQLSTATE. PDO::errorCode() возвращает только код SQLSTATE. Если вам нужна более конкретная информация об ошибке, PDO используйте метод PDO::errorInfo() который возвращает массив, содержащий код SQLSTATE, внутренний код драйвера и текстовое сообщение об ошибке.

Режим обработки ошибок PDO::ERRMODE_WARNING

PDO::ERRMODE_WARNING - В дополнение к установке кода ошибки, PDO будет выдавать традиционное сообщение E_WARNING. Этот параметр полезен во время отладки/тестирования, если вы просто хотите увидеть, какие проблемы возникли, не прерывая при этом поток приложения.

define('PDO_DSN', 'mysql:dbname=test;host=127.0.0.1');
define('PDO_USERNAME', 'root');
define('PDO_PASSWORD', 'root');
define('DEBUG_MODE', TRUE);

$pdoAttributes = array();
if(DEBUG_MODE){
	$pdoAttributes[PDO::ATTR_ERRMODE] = PDO::ERRMODE_WARNING;
}
$pdo = new PDO( PDO_DSN, PDO_USERNAME, PDO_PASSWORD, $pdoAttributes);

//	ошибка в PDO
$sql = $pdo->exec("SELECT * FROM `unknown_table`");
//	ошибка в PDOStatement
$sql = $pdo->prepare("SELECT * FROM `unknown_table`");
$sql->execute();
		

Результат:

 

Warning: PDO::exec() [pdo.exec]: SQLSTATE[42S02]: Base table or view not found: 1146

Table 'test.unknown_table' doesn't exist in ...

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42S02]:

Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist in ...

Режим обработки ошибок PDO::ERRMODE_EXCEPTION

PDO::ERRMODE_EXCEPTION - В дополнение к установке кода ошибки, PDO будет выбрасывать исключение PDOException и задаст его свойства, чтобы отразить код ошибки и саму ошибку. Этот параметр также полезен во время отладки, так как это будет эффективно "взрывать" сценарий в точке ошибки, очень быстро указывая пальцем на потенциальные проблемы в коде (помните: имеет место автоматический откатоперации, если есть исключений the script to terminate(сценарий прекратить).

Режим PDO::ERRMODE_EXCEPTION также полезен, потому что вы можете структурировать обработку ошибок более четко, чем в традиционном PHP-стиле предупреждений, и с меньшим количеством вложенности кода, чем работа в автоматическом режиме и явно проверить возвращаемые значения каждого вызова базы данных.

Пример без обработки исключения:

$sql = $pdo->prepare("SELECT * FROM `unknown_table`");
$sql->execute();
echo "PDOStatement::errorCode(): ";
print $sql->errorCode();		

Результат:

Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: 
Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist' in ...

Пример с обработкой исключения:

try{
	$sql = $pdo->prepare("SELECT * FROM `unknown_table`");
	$sql->execute();
	//	код до "}" будет пропущен, так как вызвано исключение
	echo "PDOStatement::errorCode(): ";
	print $sql->errorCode();
}catch( PDOException $e){
	//	будет выполнен
	echo 'PDOException: '.$e->getMessage();
}catch( Exception $e){
	//	будет пропущен
	echo 'Unknown error: '.$e->getMessage();
}	

Результат:

PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist

Не зависимо от того в каком из объектов PDO или PDOStatement произошла ошибка - обработка идентична:

try{
	$sql = $pdo->exec("SELECT * FROM `unknown_table`");
	echo "PDO::errorCode(): ";
	print $pdo->errorCode();
}catch( PDOException $e){
	//	будет выполнен
	echo 'PDOException: '.$e->getMessage()."<br>\n";
}catch( Exception $e){
	//	будет пропущен
	echo 'Unknown error: '.$e->getMessage()."<br>\n";
}

try{
	$sql = $pdo->prepare("SELECT * FROM `unknown_table`");
	$sql->execute();
	//	код до "}" будет пропущен, так как вызвано исключение
	echo "PDOStatement::errorCode(): ";
	print $sql->errorCode();
}catch( PDOException $e){
	//	будет выполнен
	echo 'PDOException: '.$e->getMessage()."<br>\n";
}catch( Exception $e){
	//	будет пропущен
	echo 'Unknown error: '.$e->getMessage()."<br>\n";
}	

Результат:

PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.unknown_table' doesn't exist