Ошибки и их обработка
PDO предлагает на выбор 3 стратегии обработки ошибок в зависимости от вашего стиля разработки приложений.
PDO::ERRMODE_SILENT
До PHP 8.0.0, это был режим по умолчанию. PDO просто предоставит вам код ошибки, который можно получить методами PDO::errorCode() и PDO::errorInfo() . Эти методы реализованы как в объектах запросов, так и в объектах баз данных. Если ошибка вызвана во время выполнения кода объекта запроса, нужно вызвать метод PDOStatement::errorCode() или PDOStatement::errorInfo() этого объекта. Если ошибка вызова объекта базы данных, нужно вызвать аналогичные методы у этого объекта.
PDO::ERRMODE_WARNING
Помимо установки кода ошибки PDO выдаст обычное E_WARNING сообщение. Это может быть полезно при отладке или тестировании, когда нужно видеть, что произошло, но не нужно прерывать работу приложения.
PDO::ERRMODE_EXCEPTION
Начиная с PHP 8.0.0 является режимом по умолчанию. Помимо задания кода ошибки PDO будет выбрасывать исключение PDOException , свойства которого будут отражать код ошибки и её описание. Этот режим также полезен при отладке, так как сразу известно, где в программе произошла ошибка. Это позволяет быстро локализовать и решить проблему. (Не забывайте, что если исключение является причиной завершения работы скрипта, все активные транзакции будут откачены.)
Режим исключений также полезен, так как даёт возможность структурировать обработку ошибок более тщательно, нежели с обычными предупреждениями PHP, а также с меньшей вложенностью кода, чем в случае работы в тихом режиме с явной проверкой возвращаемых значений при каждом обращении к базе данных.
Подробнее об исключениях в PHP смотрите в разделе Исключения.
PDO стандартизирован для работы со строковыми кодами ошибок SQL-92 SQLSTATE. Отдельные драйверы PDO могут задавать соответствия своих собственных кодов кодам SQLSTATE. Метод PDO::errorCode() возвращает одиночный код SQLSTATE. Если необходима специфичная информация об ошибке, PDO предлагает метод PDO::errorInfo() , который возвращает массив, содержащий код SQLSTATE, код ошибки драйвера, а также строку ошибки драйвера.
Пример #1 Создание PDO объекта и установка режима обработки ошибок
= ‘mysql:dbname=testdb;host=127.0.0.1’ ;
$user = ‘dbuser’ ;
$password = ‘dbpass’ ;
try <
$dbh = new PDO ( $dsn , $user , $password );
$dbh -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION );
> catch ( PDOException $e ) <
echo ‘Подключение не удалось: ‘ . $e -> getMessage ();
>
Метод PDO::__construct() будет всегда бросать исключение PDOException , если соединение оборвалось, независимо от установленного значения PDO::ATTR_ERRMODE . Непойманные исключения фатальны.
Пример #2 Создание экземпляра класса PDO и установка режима обработки ошибок в конструкторе
= ‘mysql:dbname=test;host=127.0.0.1’ ;
$user = ‘googleguy’ ;
$password = ‘googleguy’ ;
/*
По-прежнему оберните конструктор в блок try/catch, так как, даже при установке ERRMODE в WARNING,
PDO::__construct всегда будет бросать исключение PDOException, если соединение оборвалось.
*/
try <
$dbh = new PDO ( $dsn , $user , $password , array( PDO :: ATTR_ERRMODE => PDO :: ERRMODE_WARNING ));
> catch ( PDOException $e ) <
echo ‘Соединение оборвалось: ‘ . $e -> getMessage ();
exit;
>
// Следующий запрос приводит к ошибке уровня E_WARNING вместо исключения (когда таблица не существует)
$dbh -> query ( «SELECT wrongcolumn FROM wrongtable» );
?>
Источник
PDO не работает, даже если он включен на веб-сервере
Я перешел на новый жесткий диск и скопировал все необходимое, насколько мне известно. Я пытаюсь загрузить любую страницу, которая требует моего объекта базы данных PDO, и он вылетает.
Неустранимая ошибка: необработанная ошибка: класс ‘PDO’ не найден в /var/www/the_website.net/config/DB.php:20 трассировке стека:
# 0 /var/www/the_website.net/public_html/index.php(16): DB -> __ construct ()
# 1добавлено в /var/www/the_website.net/config/DB.php в строке 20
Это строка (и несколько окружающих строк) в DB.php:
Это просто создание объекта.
Вот мои включенные модули в /etc/php/7.2/apache2/php.ini (я просто сделал их все, потому что все равно ничего не работало):
Вот результат php -m
Я запустил phpenmod для обоих модулей.
Мой прежний жесткий диск работал под управлением PHP 7.0. Сейчас я использую PHP 7.2.
Бег на тестовой странице говорит мне:
Обновить
Я полностью удалил модули php7.0 из / usr / lib / apache2 /, так что теперь все является php7.2. Мой файл phpinfo () отображает правильные пути:
Все еще получаю Class’PDO’ not found ошибка, однако.
Что еще я могу проверить? Почему они не загружаются?
Решение
Я очистил PHP и начал все сначала. Я сделал то же самое, что и раньше, и следовал за ошибками. Я продолжал получать ту же самую фатальную ошибку, пока я не сделал:
Источник
Почему не работает pdo?
Здравствуйте. Начал изучать ооп, и одновременно с ним, пдо.
Пытаюсь написать класс подключения к бд, но возникает ошибка.
Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[28000] [1045] Access denied for user ‘root’@’localhost’ (using password: YES)’ in C:\OpenServer\domains\oop\includes\db_connects.php:16 Stack trace: #0 C:\OpenServer\domains\oop\includes\db_connects.php(16): PDO->__construct(‘mysql:host=loca. ‘, ‘root’, ‘111111’, Array) #1 C:\OpenServer\domains\oop\public\index.php(7): MySQLDatabase->__construct() #2
Помогите пожалуйста разобраться с вопросом(
- Вопрос задан более трёх лет назад
- 2975 просмотров
Да, это на локалке я проверяю. Там данные root:111111, ну или просто под root:и пустым паролем
Но перед написанием класса с подключением на пдо, проверил подключение к базе на mysqli, всё работает, так что данные 100% верные
Может я что-то не так в конструкции класса выполняю?
Проверял на хостинге, с валидными данными, там была ошибка:
Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY000] [2019] Can’t initialize character set ‘UTF8′ (path: /usr/share/mysql/charsets/)’ in /var/www/kitlhin/data/www/kit.lh1.in/test.php:16 Stack trace: #0 /var/www/kitlhin/data/www/kit.lh1.in/test.php(16): PDO->__construct(‘mysql:host=loca. ‘, ‘kit_root’, ‘Fqwer1A123a’, Array) #1 /var/www/kitlhin/data/www/kit.lh1.in/test.php(20): MySQLDatabase->__construct() #2
thrown in /var/www/kitlhin/data/www/kit.lh1.in/test.php on line 16
Поздравляю!, вы только что засветили пользователя и пароль от вашей базы. Теперь надо менять пароль.
И тут. У вас 2 разные ошибки: первая: «Access denied for user ‘root’@’localhost’ (using password: YES)» что намекает, что указаны неправильные авторизационные данные. Проверяйте пользователей в мускуле.
Во втором случае «Can’t initialize character set ‘UTF8’ (path: /usr/share/mysql/charsets/)» — не найдена кодировке «UTF8», что как бе и написано в сообщении. Проверяйте содержимое указанной директории.
Источник
Не работает PHP (PDO/ INSERT/ SELECT)
Я начал изучать и PHP, и ASP.NET, пока что у меня в голове каша..
ОС: Ubuntu 18.04
Сервер: Server version: Apache/2.4.29 (Ubuntu)/
PHP: PHP 7.2.15-0ubuntu0.18.04.1
MySQL: mysql Ver 14.14 Distrib 5.7.25 phpmyadmin: 4.8.5
А внутри add.php расположен след. код:
А внутри controller.php расположен следующий код:
Вроде всё кажется правильным, но почему-то в базу не добавляет введенные данныею
И еще как сделать так, чтоб при нажатии, на кнопку AddDB и отправил запрос,и потом возвращался на главную страницу?
1 ответ 1
Это очень хорошй и важный вопрос.
Но ответ на него не совсем очевидный. И звучит он так: «Надо правильно соединяться с PDO».
Вообще, тема «что делать, если код не работает» довольно обширная, но самое первое, что надо делать в таком случае — это попросить РНР сообрщать обо всех ошибках, которые произошли в скрипте. А в данном случае — попросить ПДО сообщать об ошибке, произошедшей при выполнении запроса. И вот как раз для этого и надо правильно соединяться: Как правильно соединяться с Mysql в PDO. помимо других важных настроек мы таже сконфигурируем правильный режим выброса ошибок для PDO.
После этого PDO начнет нам говорить, в чем у нас проблема! Надо только убедиться, что PHP в принципе настроен так, чтобы сообщать об ошибках.
Скорее всего PDO сообщит о том, что не найдена база данных или хост. Поскольку никаких украшений (включая пробелы) в DSN быть не должно. Но конкретная ошибка в данном случае не важна, поскольку ошибки всегда разные, и на все случаи все равно ответить невозможно. Но это и не нужно — надо просто прочитать сообщение об ошибке, и исправить её.
Источник
Почему не работает запрос на php + PDO?
Всем доброго времени суток, пишу скрипт авторизации на PDO, так получилось, что запрос не работает в коде, хотя когда я эту строку с данными ввожу в phpmy admin или в query browser то он срабатывает и возвращает результат, объясните дуболому, где я мог накосячить?
Файл соединения:
- Вопрос задан более трёх лет назад
- 638 просмотров
PDO::exec() запускает SQL запрос на выполнение и возвращает количество строк, задействованых в ходе его выполнения.
PDO::exec() не возвращает результат выборки оператором SELECT. Если вам нужно выбрать данные этим оператором единожды в ходе выполнения программы, пользуйтесь методом PDO::query().
вы очень постарались, чтобы не работало. Как будто специально усложнили себе жизнь, отключив возможность посмотреть результат из базы
По хорошему, то что приходит от пользователя нужно еще очищать, но задачи такой не стояло в этом задании.
Накосячено здесь везде. В каждой строчке. Но самая ерунда написана в комментариях.
> я всегда делаю, чтобы сначала работало, а потом делаю защиту и «секьюрность».
Придется избавляться от этой дурацкой привычки. Во-первых, это дорога в никуда. С такими идеями твой код всегда будет кривым. Во-вторых, это тупо двойная работа — сначала говнокодить, а потом переписывать набело. И в-третьих, нормальный код проще и удобнее говнокода. Поэтому если не умеешь работать с ПДО — надо учиться. СНАЧАЛА учиться, а потом пытаться что-то писать.
Не забыв предварительно хэшировать все пароли перед записью в БД через password_hash.
А ответ на вопрос, почему у тебя не работает сейчас, можешь прочесть в документации по exec(). Там написано.
Источник