该问题首先发布到 Stack Overflow,但由于它可能只是一个服务器问题,因此我认为也最好将其发布在这里。
我刚刚在 Macbook 上安装并配置了 Apache、MySQL、PHP 和 phpMyAdmin,以便拥有本地开发环境。但是在我将我的一个项目移至本地服务器后,我在调用 mysql_query() 时收到一个奇怪的 MySQL 错误:
拒绝用户“_securityagent”@“localhost”访问(使用密码:否)
首先,我发送给 MySQL 的查询都是有效的,我甚至通过 phpMyAdmin 测试过,结果完美。其次,只有当我每页至少有 4 个其他 mysql 连接和查询时,才会出现错误消息。对 mysql_query() 的调用发生在一个非常长的函数的末尾,该函数处理新创建或修改的文章的数据。它基本上是这样做的:
- 收集文章形式的所有数据(标题、内容、日期等)
- 验证收集的数据
- 连接到数据库
- 根据经过验证的文章数据动态构建 SQL 查询
- 关闭连接之前向数据库发送查询
我知道这很简单。我不认识用户名“_securityagent”,所以在快速搜索后,我在 Apple 的 Developer Connection 上找到了这篇文章,其中讨论了一些随机错误:
Mac OS X 的安全基础设施通过以特殊用户“_securityagent”的身份运行其 GUI 代码来解决此问题。
然后我尝试将 var_dump() 放在 mysql_connect() 调用中使用的所有变量上,每次它都返回正确的值(当然,用户名不是“_securityagent”)。因此,我想知道是否有人知道为什么“securityagent”试图连接到我的数据库 - 以及如何在调用 mysql_query() 时避免发生此错误。
更新:这是我用来连接数据库的确切代码。但必须进行一些解释:
- 连接错误发生在 class_1 中函数 X 中对 mysql_query() 的调用
- class_1 使用 class_2 连接数据库
- class_2 读取包含数据库连接变量(主机、用户、密码、数据库)的配置文件
- class_2通过以下函数连接数据库:
var $SYSTEM_DB_HOST = "";
function connect_db() {
// Reads the config file
include('system_config.php');
if (!($SYSTEM_DB_HOST == "")) {
mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
@mysql_select_db($SYSTEM_DB);
return true;
} else {
return false;
}
}
答案1
您如何呼叫mysql_query()
?我注意到您没有保存呼叫的连接句柄mysql_connect()
。在我看来,失败的mysql_query()
呼叫没有使用您正在建立的连接。
我建议您修改代码以执行以下操作:
function connect_db() {
// Reads the config file
include('system_config.php');
if ($SYSTEM_DB_HOST == "") {
return false;
}
$dbhandle = mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
if ($dbhandle) {
@mysql_select_db($SYSTEM_DB, $dbhandle);
return $dbhandle;
} else {
return false;
}
}
// ... invoke like this:
$dbhanle = connect_db();
if (!$dbhandle) {
// handle failed DB connection
}
// later, whenever you need to run queries:
$result = mysql_query($querysql, $dbhandle);
这将确保您建立的连接mysql_connect
实际上是用于查询的连接。看看这是否会改变任何事情;即使没有,我个人认为明确告诉 MySQL 您想要使用哪个数据库连接是一种很好的做法。
答案2
你应该把你的凭证传递给mysql_connect。
答案3
调用mysql_query()
可能选择了错误的连接,或者尝试打开新连接;尝试从 保存连接资源mysql_connect()
并将其显式传递给mysql_query()
。更好的是,考虑更新到更现代的驱动程序,例如 mysqli 或 PDO。作为单独的测试(并在另一个脚本中),尝试发出没有凭据的mysql_connect()
和,看看是否会出现相同的错误。mysql_query()
答案4
尝试以下方法:
var $SYSTEM_DB_HOST = "";
function connect_db() {
// Reads the config file
include('system_config.php');
if (!($SYSTEM_DB_HOST == "")) {
$handle = mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS);
@mysql_select_db($SYSTEM_DB,$handle);
return true;
} else {
return false;
}
}
$handle = connect_db();
mysql_query("QUERY",$handle);
.....
mysql_close($handle);