Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111

Редирект в случае ошибки в работе с базой данных

24.05.2017, 19:25. Показов 1322. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тренируюсь делать сайт, пока что на локальном сервере.
В php.ini запретил показ ошибок и пишу их в лог.
Некоторые ошибки я обрабатываю и что-то возвращаю пользователю. Например, если он вводит разные пароли в форму регистрации, возвращаю ему текст "Вы ввели некоректный логин или пароль".

Проблемка: В случае ошибки подключения к БД, не получается сделать редирект на нужную мне страницу. К примеру меняю пароль к БД и забываю прописать новый пароль в файле подключения, в итоге получаю ошибку Access denied for user 'user'@'localhost' (using password: YES) Эта ошибка не показывается в браузере, а записывается в файл лога это хорошо, но плохо то что пользователь никуда не перенаправляется и видит пустой белый экран. Я хочу, чтобы он перенаправлялся на указанную страницу. Общею идею как это сделать я понимаю, но у меня не получается её реализовать.

Вот фрагмент кода:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
require "../my_error_handler.php";
require_once "../includes/db.php";
 
//  основной код убрал, чтобы не отвлекать внимание читающих
 
/* Добавляем логин, hash и key_user в таблицу с помощью Prepared Statements */
if (!($sql = $database->prepare("INSERT INTO `ad_users` (`login`, `password_hash`) VALUES (?, ?)"))) {
    trigger_error("Prepare failed: (" . $database->errno . ") " . $database->error);
    header("Location: /pages/login_form.php?err=5");
    die;
    /* если по каким-то причинам соединение с базой данных не устанавливается, то этот блок кода НЕ срабатывает, 
        редирект не срабатывает. А по моих ожиданиям должен срабатывать. Что здесь не так? */
} 
 
if (!$sql->bind_param('ss', $login, $hash) ) {
    trigger_error("Binding parameters failed. (ERRNO: " . $sql->errno . ") " . $sql->error);
    header("Location: /pages/login_form.php?err=5");
    die;
}
if (!$sql->execute()){
    trigger_error("Exetute failed. (ERRNO: " . $sql->errno . ") " . $sql->error);
    header("Location: /pages/login_form.php?err=5");
    die;
}
Пробовал в проблемном блоке просто вывести любую строку, но она тоже не выводится. Не могу понять почему. По идее в случает ошибки там же должно быть false, которое превращается с помощью восклицательного знака в true.

Вот:
PHP
1
2
3
4
/* Добавляем логин, hash и key_user в таблицу с помощью Prepared Statements */
if (!($sql = $database->prepare("INSERT INTO `ad_users` (`login`, `password_hash`) VALUES (?, ?)"))) {
    echo "Hello, World";
}
Строка "What the hell" не показывается. Почему она не показыватся?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2017, 19:25
Ответы с готовыми решениями:

Ошибки при работе с базой данных
Здравствуйте, недавно начал изучать работу с базой данных через Qt. Использую Qt 4.8 и Sqlite Вроде код взят с книги М. Шлее, но всё...

Си # ошибки при работе с базой
Как можно отследить ошибку на целостность данных при добавлении их в базу Access

Ошибка при работе с базой данных
Есть форма, данные в которую загружаются через базу данных, при компиляции ошибок нет, но при работе возникает следующая: Additional...

12
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,912
24.05.2017, 19:49
И для каждого prepare() один и тот же код редиректа? Уныло.

Цитата Сообщение от user7845 Посмотреть сообщение
Почему она не показыватся?
Не уверен, но если вы говорите про некорректные реквизиты доступа к БД, то и проверку нужно делать на этапе подключения к БД, а не на каждый запрос одну и ту же проверку вешать.

Вообще есть функция set_error_handler(), с её помощью можно задать обработку всех возникающих ошибок. Самое простое - в случае любой ошибки (имею ввиду только ошибки в PHP скриптах) отображать страницу "Сайт временно недоступен" и заканчивать выполнение.

Если нужна более детальная обработка подобных ошибок - гораздо удобней использовать исключения вместо стандартных ошибок.
0
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111
24.05.2017, 20:39  [ТС]
И для каждого prepare() один и тот же код редиректа?
Пока что, да.

Не уверен, но если вы говорите про некорректные реквизиты доступа к БД, то и проверку нужно делать на этапе подключения к БД, а не на каждый запрос одну и ту же проверку вешать.
Согласен. Некорректные реквизиты я просто для примера привел. Еще например может быть запрос неправильно составлен и в базу ничего не добавится. Еще пример, в версии mysql с которой сейчас работаю в поле таблицы не указать значение по умолчанию, то INSERT для выборочных полей не сработает.

Я уже начал использовать set_error_handler() просто может быть не все его возможности использую. Я с его помощью записываю ошибки в текстовый файл и всё. Но меня пока что это устраивает.

Ладно. Пойду разбираться дальше, что к чему.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,912
24.05.2017, 21:14
Цитата Сообщение от user7845 Посмотреть сообщение
просто может быть не все его возможности использую
У исключений возможности гораздо шире. Рекомендую.
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
24.05.2017, 21:40
user7845, не надо на 400 и 500 ошибки отвечать 300 статусом. Получили ошибку, на этой же страницы и выводим сообщение об ошибке.
0
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111
24.05.2017, 22:02  [ТС]
не надо на 400 и 500 ошибки отвечать 300 статусом. Получили ошибку, на этой же страницы и выводим сообщение об ошибке.
Ок. Приму к сведению. У меня беда в том, что ничего не могу вывести.

PHP
1
2
3
if (!($sql = $database->prepare("INSERT INTO `ad_users` (`login`, `password_hash`) VALUES (?, ?)"))) {
    echo "Сайт временно недоступен";
}
echo не срабатывает почему-то.
0
930 / 846 / 190
Регистрация: 28.11.2013
Сообщений: 3,621
24.05.2017, 22:13
user7845, хотел промолчать, но раз уж парни отписались, то подтверждаю: даже в самых простых поделках из соображений целесообразности пришлось расширять состав штатных ошибок, генерируемых непосредственно в каркасе, до 503-ей, т.е. там, где изначально было задумано ограничиться 404-ой (и даже какое-то время использовалась только эта ошибка), все-таки пришлось ввести 503-юю как раз для ошибок, связанных с БД.

Добавлено через 8 минут
Цитата Сообщение от user7845 Посмотреть сообщение
echo не срабатывает почему-то
А почему должна срабатывать? Формат запроса вроде в порядке.
1
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,912
24.05.2017, 22:18
Цитата Сообщение от user7845 Посмотреть сообщение
У меня беда в том, что ничего не могу вывести.
Цитата Сообщение от user7845 Посмотреть сообщение
require "../my_error_handler.php";
А покажите ваш обработчик ошибок. Может вы в нём прерываете дальнейшее выполнение скрипта?
1
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111
24.05.2017, 22:18  [ТС]
Цитата Сообщение от miketomlin Посмотреть сообщение
А почему должна срабатывать? Формат запроса вроде в порядке.
Всё верно. Когда формат запроса в порядке, она не должна срабатывать. Но она не срабатывает у меня, даже когда в запросе ошибка. Например если я изменю имя переменной $database, то все равно не сработает.

PHP
1
2
3
if (!($sql = $databaasdfasdfasdfasdfasdfasdfe->prepare("INSERT INTO `ad_users` (`login`, `password_hash`) VALUES (?, ?)"))) {
    echo "Сайт временно недоступен";
}
Вот так по идее должно сработать echo, но оно у меня не срабатывает почему-то.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,912
24.05.2017, 22:19
Цитата Сообщение от miketomlin Посмотреть сообщение
А почему должна срабатывать?
Я так понимаю, потому что логин и пароль намеренно введены неверные при подключении к БД.
0
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111
24.05.2017, 22:22  [ТС]
Вот он обработчик ошибок:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
error_reporting(-1);
ini_set('display_errors',0);
ini_set('display_startup_errors', 0);
ini_set('log_errors', 1);
 
set_error_handler("errorsLog");
function errorsLog($errno, $errmsg, $file, $line)
{
    $fp=fopen('C:\OpenServer\domains\blog.ru\log.txt', 'a+');
    fwrite($fp, "ERRNO: $errno   Text: $errmsg\nFILE: $file line: $line\n(".date("r").") \n---------------------------------\n\n");
    fclose($fp);
};
Добавлено через 1 минуту
Я так понимаю, потому что логин и пароль намеренно введены неверные при подключении к БД.
Да. Намеренно ввел неправильно, чтобы посмотреть что и где и как сработает.
0
930 / 846 / 190
Регистрация: 28.11.2013
Сообщений: 3,621
24.05.2017, 22:41
Цитата Сообщение от user7845 Посмотреть сообщение
Например если я изменю имя переменной $database, то все равно не сработает.
А вот это уже глумление Ошибки подключения нужно проверять в др. месте. Уверен, подобное поведение можно объяснить, даже если оно не совсем явное – это ж пых (С)

Добавлено через 8 минут
...обращаемся к методу фиг знает чего и надеемся на адекватную реакцию?
1
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111
24.05.2017, 22:53  [ТС]
Цитата Сообщение от miketomlin Посмотреть сообщение
А вот это уже глумление
Ну я тоже начал себя в этом подозревать)) Оставлю пока как есть, тем более, что в лог он всё что надо пишет. Например ERRNO: 8 Text: Undefined variable: $databaasdfasdfasdfasdfasdfasdfe

Действительно, надо проверять сразу подключение в файле db.php и выдавать в случае невозможности подключение пользователю сообщение типа "Сайт временно недоступен", ну а в лог писать подробности ошибки.

И кстати, проверил сейчас, вот этот вариант срабатывает нормально:
PHP
1
2
3
4
if (!($sql = $database->prepare("INSERT INTO `ad_users` (`login`, `password_hash`) VALUES (?, ?, ?, ?, ?, ?, ?,  ?, ?, ?, ?)"))) {
    echo "Сайт временно недоступен";
    exit;
}
Получаю сообщение и скрипт останавливается. Всё как я и ожидал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.05.2017, 22:53
Помогаю со студенческими работами здесь

Ошибка при работе с базой данных
Здравствуйте. При попытки чтения строк из БД в работе программы возникает ошибка "Ссылка на объект не указывает на экземпляр...

Нужен совет в работе с базой данных
Добрый день! Подскажите пожалуйста, кто работает с JAVA. Я стал ее изучать полгода назад. Опыт программирования не малый, но web языки....

Простое приложение по работе с базой данных
Дело в том, что школа сказала сделать проект, я вызвался,но навыком не хватает, надо сделать подключение к базе данных и вывод этих данных...

Иероглифы при работе с базой данных!
Здравствуйте! На главной странице есть 2 текста - первый который был прописан в HTML коде, а второй берётся с базы данных. Вот...

Ошибка при работе с базой данных
скажите почему ошибка при этих строках: sqdb.insert(sms.TABLE_NAME1, sms.NAME1, cv); sqdb.execSQL("CREATE TABLE " +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru