我昨天遇到了一个奇怪的问题。我运行着一个安装有PHP 4.4.4-8和mysql 5.5.9的Debian服务器,该服务器提供多个网站服务。但是我不知道为何,有时在加载网页时会出现“Access denied for user 'www-data'@'localhost' (using password: NO)”错误。
如果我刷新页面,页面就会正常加载,但是在点击几次后,那个错误信息又会出现。该页面用于连接mysql服务器的用户名不是 www-data。
有人遇到过类似的问题吗?
www-data
是运行 Apache 和 PHP 的 Debian 用户。如果在没有有效连接的情况下尝试查询,php/mysql 将尝试使用 <unix-user>@localhost
建立连接,且不需要密码。这就是 www-data@localhost (using password:NO)
的来源。
现在出现这个问题最有可能的原因(虽然之前已经运行了两年良好)是您的数据库负载已经增加到某些连接无法成功的程度(可能是由于 max_connections 或 max_user_connections,但也可能是由于其他限制,如内存、线程等)。当发生这种情况时,对 mysql_connect
的调用将会发出错误消息,并返回 FALSE。如果未能检测到此故障,则您下一个 mysql 调用(可能是 mysql_query 或 mysql_select_db)将尝试连接到 www-data@localhost,从而导致您看到的问题。
我建议启用错误报告和错误显示(如 @DarkMantis 建议的):
ini_set('error_reporting', E_ALL|E_STRICT);
ini_set('display_errors', 1);
此外,请确保您对mysql_connect的调用没有使用@
符号,并确保检查返回值。它应该类似于这样:
$cxn = mysql_connect('localhost','yourusername','yourpassword');
if( $cxn === FALSE ) { die('mysql connection error: '.mysql_error()); }
mysql_connect()
捕获错误,打印mysql_error()
消息,并终止脚本(如上所述)。在mysql_connect()
失败后立即获取mysql_error()
消息,这个消息很可能会告诉你问题的具体原因。如果那个消息说类似“mysql:max_connections exceeded”,那么我们就知道出了什么问题。 - Lee看起来引起错误的查询是在调用特定内容时发生的。这可能意味着当调用查询时,您没有使用正确的用户名/密码连接到数据库。
请确保您已经成功连接,使用or die(mysql_error());
在所有查询变量的末尾进行调试。
另外,在php文件的顶部使用以下两行:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
这将显示您的类/文件中可能出现的任何小的php错误,这些错误可能在之前未被发现。
如果您在此之后仍然遇到问题,请发布您的PHP代码,我将直接查看它。
谢谢!
ini_set('error_reporting', E_ALL | E_STRICT);
或者只是 ini_set('error_reporting', -1);
。 - tereškomysqli_query()
时,调用mysqli_connect()
后再调用mysql_query()
可能会发生此错误。请注意,应该使用mysqli_query()
。对我来说,关闭安全模式解决了这个问题:
Notice: mysql_connect(): SQL safe mode in effect - ignoring host/user/password information in /var/www/html/test.php on line 4
使用密码“NO”
(MySQLi Object-Oriented)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
(MySQLi Object-Oriented)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>
mysql_query()
而不执行mysql_connect($hostname, $username, $password)
? - Salman A