|
|
|
| Подскажите, пожалуйста, в чём тут у меня ошибка:
if($IsItPDOversion) try { $dbHandle->query($q);} catch(PDOException $e) { exit("Error!: ".$e->getMessage()."<br/>\n".$q."<br/>\n".__LINE__); }
|
Уникальный ключ не позволяет выполнить запрос, но скрипт продолжает выполняться. | |
|
|
|
|
|
|
|
для: Eugene77
(24.05.2016 в 07:56)
| | я не работал с PDO , но может причина в скобках:
if($IsItPDOversion){try..}
| или условие всунуть в трай.... | |
|
|
|
|
|
|
|
для: vadimka
(24.05.2016 в 17:48)
| | может причина в скобках
То есть имеется в виду нарушение синтаксиса при написании try - catch конструкции? | |
|
|
|
|
|
|
|
для: vadimka
(24.05.2016 в 17:48)
| | я не работал с PDO , но может причина в скобках
А PDO то причем? Обработки исключительных ситуаций не есть собственность PDO, и конструкция записывается именно так:
try {
выполнение
} catch (error) {
ошибка
} | |
|
|
|
|
|
|
|
для: Eugene77
(24.05.2016 в 07:56)
| | Если выполняется, значит условие соблюдается. | |
|
|
|
|
|
|
|
для: confirm
(25.05.2016 в 16:43)
| | >Если выполняется, значит условие соблюдается.
Да, видимо, соблюдается.
Значит я не то исключение перехватываю.
Но в PDO и рядом с PDO много разного типа исключений и я не могу разобраться что именно надо перехватывать, чтобы прописать реакцию скрипта на попытку добавить запись с имеющимся уже уникальным ключом. | |
|
|
|
|
|
|
|
для: Eugene77
(26.05.2016 в 12:26)
| | Вы перехватываете PDO исключение а вам нужно общее, поставте после кетча еще одно:
} catch (Exception $e) {
echo "General Error: .<br>".$e->getMessage();
}
|
| |
|
|
|
|
|
|
|
для: Eugene77
(26.05.2016 в 12:26)
| | прописать реакцию скрипта на попытку добавить запись с имеющимся уже уникальным ключом
Так эту реакцию нужно проверять во время добавления записи, когда попытка вернет ошибку. В противном случае, проверка дубликата до записи (ваше условие это и предполагает), совсем не требует обработки исключения, есть дубликат, значит и запроса делать не надо. | |
|
|
|
|
|
|
|
для: confirm
(26.05.2016 в 14:04)
| | >Так эту реакцию нужно проверять во время добавления записи, когда попытка вернет ошибку. В противном случае, проверка дубликата до записи (ваше условие это и предполагает)
Разве это не проверка во время записи?
try { $dbHandle->query($q);} catch(PDOException $e) {}
|
Ведь Try охватывает именно операцию записи...
Как тогда сделать проверку во время записи? | |
|
|
|
|
|
|
|
для: Eugene77
(26.05.2016 в 15:20)
| | Как это может быть во время записи, если условие до самой записи?
if($IsItPDOversion) try { $dbHandle->query($q);}
Найдите в сети любой класс для PDO, там ознакомитесь как производится запись/чтение и как обрабатываются исключения. Это поможет понять. Ваше же, это нечто неадекватное. | |
|
|
|
|
|
|
|
для: confirm
(26.05.2016 в 15:46)
| | > Ваше же, это нечто неадекватное.
Переменная $IsItPDOversion в данном случае точно равна true.
Она раньше выставляется, когда проверяется наличие расширения PDO у данного PHP.
А дальше следует else после которого используется обычный код, как было до PDO.
Он ошибку записи нормально ловит.
А вот данный код с try почему-то не выполняет условие по catch()
Я понимаю, что неадекватное, раз не работает, но знакомство с чужими классами не помогает понять свои ошибки. | |
|
|
|
|
|
|
|
для: Eugene77
(27.05.2016 в 10:11)
| | $IsItPDOversion - для чего, проверить нечто на совместимость, но а причем тут запросы?
Проверили, создали подключение, вот это подключение может быть try catch, который в случае успеха возвращает объект. Все, пользуйтесь им.
Если вы хотите обрабатывать исключения при запросах, то ваша запросы должны выполняться там же, где и было создано подключение - PDO объект. Вы можете расширить своим дополнением стандартный класс обработки исключений.
Возьмите готовый класс того для работы, по мере его использования может придет прояснение что к чему. Почитайте статьи, много есть на Хабре. | |
|
|
|
|
|
|
|
для: 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__);
|
| |
|
|
|
|
|
|
|
для: Eugene77
(27.05.2016 в 17:03)
| | А не жирно ли будет? Выставляя код на сервер не сложно проверить (а делать это необходимо) наличие нужной минимальной версии РНР, SQL, ... И я не знаю еще случая, чтобы хост хотя бы немного уважающий себя не предложил PDO. Если обратное, то зачем связываться с хостом предлагающем устаревшее убожество?
А вот вываливать ошибки сервера клиенту это очень плохо - exit("line=".__LINE__." ".MySQL_Error()) | |
|
|
|
|
|
|
|
для: confirm
(27.05.2016 в 18:45)
| | Ну, это вы не по теме.
Этот скрипт вообще не для широкой публики пишу.
А у клиента собственный сервер, где он не хочет менять версию PHP, и имеет на то основания: много скриптов написано под 5.0.3 или что-то возле того. Копия скрипта на обычном хостинге. В общем - это для технических целей скрипт.
А вы как неудавшуюся из-за уникального ключа попытку записи перехватываете? | |
|
|
|
|
|
|
|
для: Eugene77
(28.05.2016 в 17:34)
| | PDO доступно с версии 5.0 как PECL расширение, начиная с версии 5.1 внедрено в PHP. И не так много существенных отличий 5.0 от 5.1, которые бы не позволяли корректно работать скриптам. Впрочем дело хозяйское.
Если вы в PDO будете отлавливать каждую ошибку индивидуально, то зачем вам вообще иметь exceptions?
Возьмите готовый класс под PDO, используйте и на задавайтесь вопросами как там все устроено, если не можете этого понять. ) | |
|
|
|