За последние 24 часа нас посетили 22376 программистов и 1055 роботов. Сейчас ищут 617 программистов ...

PDO не бросает Exception при Warning

Тема в разделе "PHP и базы данных", создана пользователем iadfeshchm, 28 сен 2016.

Метки:
?

Добавлять ли на форум посты если ответ пришел во время написания?

Голосование закрыто 12 окт 2016.
  1. Да

    1 голосов
    100,0%
  2. Нет

    0 голосов
    0,0%
  1. iadfeshchm

    iadfeshchm Новичок

    С нами с:
    28 сен 2016
    Сообщения:
    1
    Симпатии:
    2
    Вот всегда так, начинаешь писать на форум вопрос и сразу становится понятно. Однако, кому интересна причина самого вопроса смотрим далее:

    тут https://php.ru/manual/pdo.error-handling.html
    сказано:
    PHP:
    1. // Следующий запрос приводит к ошибке уровня E_WARNING вместо исключения (когда таблица не существует)
    2. $dbh->query("SELECT wrongcolumn FROM wrongtable");
    и при PDO::ERRMODE_EXCEPTION должно:
    "Помимо задания кода ошибки PDO будет выбрасывать исключение PDOException"
    Мой код:
    PHP:
    1. $opt = [
    2.     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    3.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    4.     PDO::ATTR_EMULATE_PREPARES => false, // За обработку подготовленных выражений отвечает сам PDO.
    5.     PDO::ATTR_STRINGIFY_FETCHES => false, // Преобразовывать числовые значения в строки во время выборки.
    6. ];
    7. $pdo = new PDO("mysql:host=$host;charset=$charset", $user, $password, $opt);
    8.  
    9. ...
    10.  
    11. $sql = '
    12. drop procedure if exists `tree_ct_add`;
    13. drop procedure if exists `tree_ct_add`;
    14. drop procedure if exists `tree_ct_add`;
    15. drop procedure if exists `tree_ct_add`;
    16. drop procedure if exists `tree_ct_add`;
    17. drop procedure if exists `tree_ct_add`;
    18. drop procedure if exists `tree_ct_add`;
    19. ';
    20.     try {
    21.         $intOrFalse = $pdo->exec($sql);
    22.         echo "<pre>";
    23.         var_dump($pdo->query("SHOW WARNINGS")->fetch());
    24.         echo "</pre>";
    25.     } catch (PDOException $e) {
    26.         echo "PDOException: <pre>";
    27.         echo $e->getMessage();
    28.         echo "</pre>";
    29.         die();
    30.     }
    Собственно ответ скрипта:
    Код (Text):
    1. array(3) {
    2.   ["Level"]=>
    3.   string(4) "Note"
    4.   ["Code"]=>
    5.   int(1305)
    6.   ["Message"]=>
    7.   string(41) "PROCEDURE tree.tree_ct_add does not exist"
    8. }
    Вот зашибись, это же Note а не Ворнинг, Вот всегда так, начинаешь писать на форум вопрос и сразу становится понятно.
     
    topas и denis01 нравится это.