#mysql #pdo
#mysql #pdo
Вопрос:
В какой-то момент ранее, похоже, было слишком много подключений к sql, и следующее было отправлено на экран для тех, кто искал:
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08004] [1040] Too many connections' in /dir/file.php:21
Stack trace:
#0 /dir/file.php(21): PDO->__construct('mysql:host=loca...', 'the user', 'password')
Как вы можете видеть, он напечатал имя пользователя и пароль.
Я новичок в PDO-форме подключения к БД, и я попал в нее, потому что люди сказали мне, что моя обычная форма mysql_connect небезопасна. Однако по умолчанию, когда mysql_connect когда-либо имел слишком много подключений, он никогда не выводил имя пользователя и пароль на экран.
Какая катастрофа.
Как мне остановить PDO от этого, если ошибка отсутствует??
Я использую:
$dbh = new PDO('mysql:host=localhost;dbname=' . $db, $user, $pass);
Комментарии:
1. Вы когда-нибудь выясняли это?
2. Я согласен, что это проблема, и ее следует сообщить команде PDO. Пожалуйста, проголосуйте за сокрытие учетных данных при ошибке: bugs.php.net/bug.php?id=62184
3. Хорошо — подойдет. Хотя это кажется странным, даже должна быть необходимость голосовать — просто смешно печатать учетные данные имени пользователя и пароля по умолчанию в сообщении об ошибке!! И особенно, когда, по-видимому, по крайней мере, мое понимание PDO заключается в создании более безопасного способа доступа к базе данных! Супер сбой.
Ответ №1:
PDO не делает ничего подобного.
Это происходит потому, что вы не выполняете никакой обработки исключений, поэтому вызывается обработчик ошибок PHP по умолчанию и показывает ваш стек вызовов, включая аргументы функции.
Обычно стеки вызовов — это очень хорошая вещь, поэтому вы хотите, чтобы обработчик ошибок работал; вам просто нужно правильно его использовать.
- Поместите
try
/catch
blocks в соответствующие места вокруг кода, который может вызывать исключения; по крайней мере, поместите catch-alltry
/catch
block вокруг верхнего уровня вашего кода, чтобы ничего не просочилось.
Однако в документации PDO четко указано (в красном предупреждающем окне), что вы подвергаетесь большому риску, если неправильно перехватываете исключения PDO:
Если ваше приложение не улавливает исключение, вызванное конструктором PDO, по умолчанию движок zend завершает сценарий и отображает обратную трассировку. Эта обратная трассировка, скорее всего, покажет полную информацию о подключении к базе данных, включая имя пользователя и пароль. Вы несете ответственность за перехват этого исключения либо явно (с помощью оператора catch), либо неявно с помощью set_exception_handler() .
Комментарии:
1. Это имеет смысл для более умной версии меня. Теперь, если бы я мог разобраться, что такое try / catch. спасибо за указатель!!
2. @cosmicbdog: Вам определенно нужно узнать об исключениях, прежде чем использовать библиотеку, в которой они используются!
Ответ №2:
Отредактируйте свой php.ini и установите
display_errors = 0
Если у вас нет доступа к php.ini, то в верхней части вашего скрипта (ов) вам нужно добавить:
ini_set("display_errors", "0");
Смотрите http://php.net/manual/en/errorfunc.configuration.php и http://php.net/manual/en/function.error-reporting.php
Это остановит вывод всех ошибок в браузер. Убедитесь, что вы все еще регистрируете ошибки (через настройку php.ini).
PS Не выбрасывайте PDO
Комментарии:
1. @Tomalakgeret’kal Я полностью согласен, однако вы все равно хотите отключить вывод в браузер в качестве меры предосторожности.
2. либо сработает — следуйте соглашению в вашем файле php.ini
3. Если вы отключите ошибки, вы не увидите, что происходит… (однако спрячьте их для производства)