Я настраиваю класс устаревшей базы данных, написанный для PHP / 5.2, который был разработан для подключения к MySQL и скрыть все ошибки. Я настроил экземпляр PDO для исключения исключений:
new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))
Теперь мне нужно настроить свой код соответственно, чтобы обрабатывать случай, когда функции могут генерировать исключение, где бы они не были раньше, поэтому я направляюсь к руководству.
В некоторых случаях руководство является явным, например PDO::prepare
:
Если сервер базы данных успешно подготовит оператор,
PDO::prepare()
возвращает объектPDOStatement
. Если сервер базы данных не может успешно подготовить оператор,PDO::prepare()
возвращаетFALSE
или испускаетPDOException
(в зависимости от обработки ошибок) .
В других случаях это расплывчато, например PDO::commit
:
Возвращает
TRUE
при успешномFALSE
илиFALSE
при сбое.
PDOException
если нет активной транзакции.
(Может ли он выйти по другой причине и просто вернуть false
?)
И бывают случаи, когда исключения даже не упоминаются, например PDO::bindValue
:
Возвращает
TRUE
при успешномFALSE
илиFALSE
при сбое.
… хотя ясно, что он действительно бросает PDOException
при ошибке (по крайней мере, при определенных ошибках).
Должен ли я по-прежнему проверять возвращаемое значение методов, возвращающих false
при ошибке, если в руководстве не указано иное?
Нет, когда вы устанавливаете PDO::ERRMODE_EXCEPTION
, всегда будут исключения для любых ошибок
Когда у вас есть исключения, и в вашем коде произошла ошибка, код сразу прекращает выполнение этой функции, поэтому он ничего не возвращает.
Чтобы быть пустым, вам не нужно проверять возвращаемые значения, но если вы этого не сделаете, вы не можете ничего исправить, и вы полностью положитесь на ошибку PDO.
Когда я создал свою систему баз данных, я использую в себе и то, и другое, если я вижу ошибку, я сам бросаю ее. Например, $pdo->prepare('')
очень $pdo->prepare('')
но будет ошибкой при привязке.
Тогда есть другие функции, такие как fetch
которая не является ошибкой, если в базе данных нет результатов, а не проверять результаты, которые были бы глупыми.
Теперь, чтобы совершить неудачу, я считаю, что есть один сценарий, который заставит его возвращать false, не вызывая исключения, а именно, когда соединение с сервером падает после подключения к базе данных и перед вызовом PDO::commit
, достаточно хорошо знать если у вас есть удаленный сервер базы данных.
Поэтому, чтобы ответить на ваш вопрос, да, он может выйти из строя, не вызывая исключения, но его время должно быть очень специфичным, даже если у вас есть локальная база данных.
Попробуй это
try { $db = new PDO("mysql:host=localhost;dbname=dbname", "username", "password"); }catch( PDOException $Exception ) { $Exception->getMessage( ) ; }