Лучший способ обработать исключения запроса PDO - PullRequest
2 голосов
/ 23 июня 2011

У меня есть базовый вопрос о передовых методах использования блоков try / catch с запросами PDO в php.Скажем, у меня есть запрос:

$sql = "SELECT id FROM table WHERE name = ?";
$sth = $dbh->prepare($sql);
$sth->bindValue(1, $param);
$sth->execute();
$result = $sub_sth->fetchColumn();

Каков наилучший метод для инкапсуляции этого в блоке try и перехвата исключения в синтаксисе sql или при выполнении?

Примечание: само соединение PDO ($ dbh) уже имеет обработку исключений.

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Обычно полезно сделать обработку ошибок как можно более атомарной. Инкапсулируйте каждый из операторов, которые могут вызвать исключение, в отдельном блоке try / catch.

В этом случае операторы, которые могут выдавать исключения:

$sth = $dbh->prepare($sql);

и

$sth->execute();

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

См. статью Ральфа Шиндлера для углубленного изучения предмета.

1 голос
/ 23 июня 2011

В зависимости от конфигурации PDO использует эмулированные подготовленные операторы.Следовательно, сам вызов ->prepare не будет вызывать исключение.Вот почему вы должны обернуть prepare и ->execute в один и тот же блок try{}.

По моему опыту с реально подготовленными запросами, редко встречаются исключения только для вызова ->executeОбычно это неправильный SQL-запрос.Однако это проблема разработки, а не проблема времени выполнения, поэтому отлов исключений для подготовки кажется менее логичным.

В любом случае, я бы посоветовал обернуть оба варианта, если вы действительно не сможете найти способ восстановления в дваотличается от проблемы (что IMHO вряд ли для SQL ->prepare и синтаксических ошибок.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...