在之前的某个时刻,似乎有太多的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连接到db的新形式,我进入它是因为人们告诉我我的常规mysql_connect表单是不安全的。但是,默认情况下,当mysql_connect连接过多时,从不将用户名和密码打印到屏幕上。
真是个灾难。
如果错误消失,我如何阻止PDO执行此操作?
我正在使用:
$dbh = new PDO('mysql:host=localhost;dbname=' . $db, $user, $pass);
答案 0 :(得分:3)
PDO没有做任何类似的事情。
这是因为您没有执行任何异常处理,因此正在调用默认的PHP错误处理程序并显示您的调用堆栈,包括函数参数。
通常调用堆栈是一件非常好的事情,所以你希望错误处理程序能够工作;你只需要正确使用它。
try
/ catch
块放在可能引发异常的代码周围的相关位置;至少,在代码的顶层放置一个全能try
/ catch
块,以便不会渗透。如果您的应用程序没有捕获从PDO构造函数抛出的异常,则zend引擎采取的默认操作是终止脚本并显示后向跟踪。此回溯可能会显示完整的数据库连接详细信息,包括用户名和密码。您有责任通过显式(通过catch语句)或通过set_exception_handler()隐式捕获此异常。
答案 1 :(得分: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设置)。
P.S。不要抛弃PDO