Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перехват ошибок в PDO
 
 автор: Eugene77   (24.05.2016 в 07:56)   письмо автору
 
 

Подскажите, пожалуйста, в чём тут у меня ошибка:
if($IsItPDOversion) try { $dbHandle->query($q);} catch(PDOException $e) { exit("Error!: ".$e->getMessage()."<br/>\n".$q."<br/>\n".__LINE__); }

Уникальный ключ не позволяет выполнить запрос, но скрипт продолжает выполняться.

  Ответить  
 
 автор: vadimka   (24.05.2016 в 17:48)   письмо автору
 
   для: Eugene77   (24.05.2016 в 07:56)
 

я не работал с PDO , но может причина в скобках:
if($IsItPDOversion){try..}
или условие всунуть в трай....

  Ответить  
 
 автор: Eugene77   (25.05.2016 в 08:54)   письмо автору
 
   для: vadimka   (24.05.2016 в 17:48)
 

может причина в скобках
То есть имеется в виду нарушение синтаксиса при написании try - catch конструкции?

  Ответить  
 
 автор: confirm   (25.05.2016 в 16:42)   письмо автору
 
   для: vadimka   (24.05.2016 в 17:48)
 

я не работал с PDO , но может причина в скобках

А PDO то причем? Обработки исключительных ситуаций не есть собственность PDO, и конструкция записывается именно так:

try {
выполнение
} catch (error) {
ошибка
}

  Ответить  
 
 автор: confirm   (25.05.2016 в 16:43)   письмо автору
 
   для: Eugene77   (24.05.2016 в 07:56)
 

Если выполняется, значит условие соблюдается.

  Ответить  
 
 автор: Eugene77   (26.05.2016 в 12:26)   письмо автору
 
   для: confirm   (25.05.2016 в 16:43)
 

>Если выполняется, значит условие соблюдается.
Да, видимо, соблюдается.
Значит я не то исключение перехватываю.
Но в PDO и рядом с PDO много разного типа исключений и я не могу разобраться что именно надо перехватывать, чтобы прописать реакцию скрипта на попытку добавить запись с имеющимся уже уникальным ключом.

  Ответить  
 
 автор: vadimka   (26.05.2016 в 13:40)   письмо автору
 
   для: Eugene77   (26.05.2016 в 12:26)
 

Вы перехватываете PDO исключение а вам нужно общее, поставте после кетча еще одно:
} catch (Exception $e) {
  echo "General Error: .<br>".$e->getMessage();
}

  Ответить  
 
 автор: confirm   (26.05.2016 в 14:04)   письмо автору
 
   для: Eugene77   (26.05.2016 в 12:26)
 

прописать реакцию скрипта на попытку добавить запись с имеющимся уже уникальным ключом

Так эту реакцию нужно проверять во время добавления записи, когда попытка вернет ошибку. В противном случае, проверка дубликата до записи (ваше условие это и предполагает), совсем не требует обработки исключения, есть дубликат, значит и запроса делать не надо.

  Ответить  
 
 автор: Eugene77   (26.05.2016 в 15:20)   письмо автору
 
   для: confirm   (26.05.2016 в 14:04)
 

>Так эту реакцию нужно проверять во время добавления записи, когда попытка вернет ошибку. В противном случае, проверка дубликата до записи (ваше условие это и предполагает)

Разве это не проверка во время записи?
try { $dbHandle->query($q);} catch(PDOException $e) {}

Ведь Try охватывает именно операцию записи...
Как тогда сделать проверку во время записи?

  Ответить  
 
 автор: confirm   (26.05.2016 в 15:46)   письмо автору
 
   для: Eugene77   (26.05.2016 в 15:20)
 

Как это может быть во время записи, если условие до самой записи?

if($IsItPDOversion) try { $dbHandle->query($q);}

Найдите в сети любой класс для PDO, там ознакомитесь как производится запись/чтение и как обрабатываются исключения. Это поможет понять. Ваше же, это нечто неадекватное.

  Ответить  
 
 автор: Eugene77   (27.05.2016 в 10:11)   письмо автору
 
   для: confirm   (26.05.2016 в 15:46)
 

> Ваше же, это нечто неадекватное.

Переменная $IsItPDOversion в данном случае точно равна true.
Она раньше выставляется, когда проверяется наличие расширения PDO у данного PHP.
А дальше следует else после которого используется обычный код, как было до PDO.
Он ошибку записи нормально ловит.
А вот данный код с try почему-то не выполняет условие по catch()

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

  Ответить  
 
 автор: confirm   (27.05.2016 в 10:55)   письмо автору
 
   для: Eugene77   (27.05.2016 в 10:11)
 

$IsItPDOversion - для чего, проверить нечто на совместимость, но а причем тут запросы?
Проверили, создали подключение, вот это подключение может быть try catch, который в случае успеха возвращает объект. Все, пользуйтесь им.

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

Возьмите готовый класс того для работы, по мере его использования может придет прояснение что к чему. Почитайте статьи, много есть на Хабре.

  Ответить  
 
 автор: Eugene77   (27.05.2016 в 17:03)   письмо автору
 
   для: confirm   (27.05.2016 в 10:55)
 

>$IsItPDOversion - для чего, проверить нечто на совместимость, но а причем тут запросы?
+Нет, не совместимость. Мне просто надо написать скрипт одинаково работающий на при наличии и при отсутствии PDO. Он так фактически и будет использоваться на двух разных хостингах с разными настройками РНР.

>Проверили, создали подключение, вот это подключение может быть try catch, который в случае успеха возвращает объект. Все, пользуйтесь им.
+ Подключение создаётся без проблем.
>
>Если вы хотите обрабатывать исключения при запросах, то ваша запросы должны выполняться там же, где и было создано подключение - PDO объект. Вы можете расширить своим дополнением стандартный класс обработки исключений.
+ Я и пытаюсь производить запись используя PDO-объект
>
>Возьмите готовый класс того для работы, по мере его использования может придет прояснение что к чему. Почитайте статьи, много есть на Хабре
+ Я читал уже довольно много всего, но как раз из прочитанного не увидел своей ошибки.
+ Мне по сути надо замену прежнему обычному :

 $r = mysql_query($q) or exit(mysql_error()." ".$q." ".__LINE__);

Всё выражение вот так выглядит:


$IsItPDOversion = false;
if(extension_loaded ('PDO'))  $IsItPDOversion = true;
if($IsItPDOversion) {
    try {
        $dbHandle = new PDO("mysql:host=localhost;dbname=$dbName", $dbUser, $dbPass);
    } catch (PDOException $e) {
        exit("Connection Error!: " . $e->getMessage() . "<br/>");
    }
}
else {
    $dbHandle = MySQL_connect($dbServer, $dbUser, $dbPass) or exit("line=".__LINE__." ".MySQL_Error());
}
if($IsItPDOversion) try { $dbHandle->query($q);} catch(PDOException $e) { exit("Error!: ".$e->getMessage()."<br/>\n".$q."<br/>\n".__LINE__); }
else $r = mysql_query($q) or exit(mysql_error()." ".$q." ".__LINE__);

  Ответить  
 
 автор: confirm   (27.05.2016 в 18:45)   письмо автору
 
   для: Eugene77   (27.05.2016 в 17:03)
 

А не жирно ли будет? Выставляя код на сервер не сложно проверить (а делать это необходимо) наличие нужной минимальной версии РНР, SQL, ... И я не знаю еще случая, чтобы хост хотя бы немного уважающий себя не предложил PDO. Если обратное, то зачем связываться с хостом предлагающем устаревшее убожество?

А вот вываливать ошибки сервера клиенту это очень плохо - exit("line=".__LINE__." ".MySQL_Error())

  Ответить  
 
 автор: Eugene77   (28.05.2016 в 17:34)   письмо автору
 
   для: confirm   (27.05.2016 в 18:45)
 

Ну, это вы не по теме.
Этот скрипт вообще не для широкой публики пишу.
А у клиента собственный сервер, где он не хочет менять версию PHP, и имеет на то основания: много скриптов написано под 5.0.3 или что-то возле того. Копия скрипта на обычном хостинге. В общем - это для технических целей скрипт.
А вы как неудавшуюся из-за уникального ключа попытку записи перехватываете?

  Ответить  
 
 автор: confirm   (28.05.2016 в 20:56)   письмо автору
 
   для: Eugene77   (28.05.2016 в 17:34)
 

PDO доступно с версии 5.0 как PECL расширение, начиная с версии 5.1 внедрено в PHP. И не так много существенных отличий 5.0 от 5.1, которые бы не позволяли корректно работать скриптам. Впрочем дело хозяйское.

Если вы в PDO будете отлавливать каждую ошибку индивидуально, то зачем вам вообще иметь exceptions?
Возьмите готовый класс под PDO, используйте и на задавайтесь вопросами как там все устроено, если не можете этого понять. )

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования