mysql — PHP PDO в режиме исключения — все еще нужно проверить возврат функции execute (и других)?

TLDR: Кто-нибудь знает о конкретных случаях, кроме показанного ниже, где PDO::exec(), PDO::query(), PDO::prepare(), или же PDOStatement::execute() может вернуть ложь без исключения, несмотря на PDO::ATTR_ERRMODE устанавливается на PDO::ERRMODE_EXCEPTION?

Я пытаюсь решить, хочу ли я добавлять проверку на ложь в каждый запрос к базе данных, который я пишу, или это избыточно.

Изменить: В настоящее время я использую исключительно MySQL, но если фактор переносимости, этого может быть достаточно для принятия решения. я использую PDO::ATTR_EMULATE_PREPARES => FALSE если это имеет значение


Это конкретный случай, который я упомянул. Если вы подготовите оператор с 0 или более заполнителями (любого типа), а затем предоставите массив аргументов PDOStatement::execute() с большим количеством элементов, чем заполнителей, false возвращается без исключения Обратите внимание, что выполнение завершается успешно (и только дополнительное связывание не выполняется), если PDOStatement::bindValue() используется вместо Использование меньшего количества параметров, чем заполнителей, вызывает исключение, независимо от того, были ли параметры переданы в функцию execute через массив или связаны с использованием PDOStatement::bindValue()/PDOStatement::bindParam(),

// Execute returns false, no exception thrown
$so = $rh->pdo->prepare("SELECT * FROM config");
if($so->execute(['Test']) === FALSE) echo '1. False returned <br />';

// Execute does not return false, no exception thrown
$so = $rh->pdo->prepare("SELECT * FROM config");
if($so->bindValue(1, 'Test') === FALSE) echo '2. Binding failed <br />';
if($so->execute() === FALSE) echo '2. False not returned <br />';

// Execute returns false, no exception thrown
$so = $rh->pdo->prepare("SELECT * FROM config WHERE webmaster_name = ?");
if($so->execute(['Test', 'Wee']) === FALSE) echo '3. False returned <br />';

// Execute does not return false, no exception thrown
$so = $rh->pdo->prepare("SELECT * FROM config WHERE webmaster_name = ?");
$so->bindValue(1, 'Test');
if($so->bindValue(2, 'Wee') === FALSE) echo '4. Binding failed <br />';
if($so->execute() === FALSE) echo '4. False not returned <br />';

Outputs:
1. False returned
2. Binding failed
3. False returned
4. Binding failed

В операторе select не особо опасно в этом случае полагаться на исключения, поскольку в любом случае возникнет ошибка, если вы попытаетесь вызвать метод выборки для FALSE вместо PDOStatement объект. Но есть такие запросы, как INSERTS или UPDATES, которые могут молча провалиться, если вы не выполните ложную проверку.


Я изучал PDO, и я пытаюсь выбрать общую практику для обработки ошибок в будущем.

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

ИЛИ ВЫ? (реплика драматической музыки)

Когда я читал, я обнаружил более одного упоминания о функциях PDO (не о типе извлечения), возвращающих false без исключения.

Мой вопрос заключается в том, считается ли наилучшей практикой также проверка возврата этих функций, или же большинство людей считают, что это излишнее.

Я видел много противоречивых утверждений о SO. Я видел многочисленные заявления с одной стороны: «Исключения PDO надежны»; «Исключения PDO всегда будут выдаваться при возвращении FALSE» (голосуют люди, говорящие «Я думаю, что это правда»).

Вот некоторые комментарии, которые заставляют меня задуматься, хотя мне еще предстоит увидеть конкретный пример, кроме того, который я упомянул.


От Могут ли методы PDO давать сбой и не генерировать исключение PDOException?:

Я не мог воспроизвести этот сценарий из нескольких тестовых случаев (у меня отключен режим эмуляции).

  1. «(Райан Винсент), когда эмулирует, ложно и … типы привязки неверны. Иногда это может не вызывать исключения».

Этот, кажется, был опровергнут? Я не уверен, как это проверить.

  1. «(Xorifelse) Теперь для совершения неудачи, я думаю, есть 1 сценарий, который заставил бы его вернуться false без выдачи исключения, и это когда соединение с сервером обрывается после подключения к базе данных и перед вызовом PDO::commitдовольно хорошо знать, если у вас есть удаленный сервер базы данных. Поэтому, чтобы ответить на ваш вопрос, да, он может потерпеть неудачу без исключения, но его время должно быть очень конкретным, даже если у вас есть локальная база данных ».

От будет ли ложно возвращенный PDO execute () таким же образом, как и исключение, которое оно выдало?:

Это единственный конкретный сценарий, который мне довелось повторить (см. Выше).

  1. «(Niksac) я видел execute() возврате false без исключения, что, на мой взгляд, является неожиданным / плохим поведением. Это означает, что мы в основном должны параллельно выполнять обработку ошибок и исключений. В моем случае: если я подготовил запрос вставки без каких-либо параметров, а затем выполнялся с параметром. Выполнение не вызовет исключение, но вернет false«.

От Должен ли я проверить возвращаемое значение операции execute в pdo php:

  1. «(Castis) $stmt->execute() может абсолютно вернуть false без исключения. «

Я думаю, что нашел, по крайней мере, еще одно неспецифическое упоминание о том, что это возможно (возвращено ложное, без исключения), хотя я не могу отследить их снова.


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

Случай, который я описал, не является чем-то, что я, вероятно, испорчу в повседневном использовании. Или, если я все испорчу, я должен немедленно узнать. И если бы я когда-либо динамически построил число заполнителей или параметров в запросе, я бы знал, чтобы убедиться, что счетчик совпадает и / или проверить на ложность в этом одном случае.

Я просто не хочу проверять возврат каждого использования execute, query и т. Д., Если это действительно не нужно. Если упомянутый мной пример является единственным известным случаем, я бы чувствовал себя комфортно, оставляя ложную проверку большинства запросов, что позволило бы мне сделать больше цепочек методов:

$user_info = $rh->pdo->query("SELECT * FROM users WHERE user_id = 1")->fetch();

// vs

$so = $rh->pdo->query("SELECT * FROM users WHERE user_id = 1");
if($so === FALSE) // Throw an exception
$user_info = $so->fetch();

Я думаю, что я ищу, это некоторые заверения от более опытных разработчиков, что это нормально, чтобы обойти эту проверку, как я вижу, люди делают. Или это, или люди, рассказывающие мне, как они были сожжены, обходя эту проверку.

10

Решение

Там определенно разные подводные камни в зависимости от того, какую базу данных вы используете. Если переносимость вызывает беспокойство, я бы не стал полагаться на некоторые из особенностей MySQL, которые вы, похоже, обнаружили выше.

Например, есть такие:

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector