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

В соответствии с просьбой я переформатирую вопрос:

Для следующего кода:

$newPDO=new PDO($DSN,$USER,$PASS); $newPDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $SQL='SOME SQL STATEMENT MAYBE FAULTY'; try{ $Query=$newPDO->Prepare($SQL) $Success=$Query->execute(); if(!$Success) echo('A'); } catch(PDOException $e) { echo('B'); } 

Вопрос в том, можно ли напечатать «А»? Будет ли ответ отличаться для разных типов $SQL например select или insert?

Оригинальный вопрос:

  • Сначала я устанавливаю атрибут PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION, так что, я думаю, когда execute () обнаруживает ошибку из БД, он должен вызывать исключение. Затем я понял, что если это правда, мне даже не нужно проверять возврат execute () до тех пор, пока исключение будет таким же, как и «false». Мне просто нужно ловить снаружи. Если ничего не поймать, запрос должен быть в порядке.
    Но я не уверен в этом, поскольку execute () по умолчанию не передает исключение в соответствии с руководством. Я попытался выполнить несколько операций, таких как дублирование ПК и уникальное нарушение ограничений, когда я что-то вставляю. мое утверждение поддерживается: PDO выдаст исключение, и я могу получить сообщение об ошибке detaield из DB. Однако я не знаю, является ли это универсальной истиной . Возможно ли получить значение false из execute (), а не PDOEXCEPTION, если я установил ERRMODE максимум? *

Попробуй это:

  try { //Initial query processing $execute = $query->execute() if (!$execute) { //catch the exception throw new Exception ("blah") } } catch (Exception $e) { //Exception logic here } 

Напишите ваши запросы, подобные этому, и если они столкнутся с исключением в разделе try , он перейдет в раздел catch и вы сможете обрабатывать его, как вам нравится (независимо от того, зависит ли ID от определенного случая).

Если исключений нет, он никогда не достигнет оператора catch , и ваш запрос будет просто выполнен.

Когда дело доходит до DUPLICATES -> вам нужно обойти это в SQL. Например, ваш запрос может быть:

 INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); 

Я видел, что execute () возвращает false, не бросая исключение, которое, на мой взгляд, является неожиданным / плохим. Это означает, что мы в основном должны делать одновременно – обработку ошибок и исключений параллельно.

В моем случае: если я подготовил запрос вставки без каких-либо параметров, а затем выполнил с параметром. Execute не генерирует исключение, а возвращает false. Я предлагаю любому использовать решение @ mlishn.