【发布时间】:2009-07-29 21:43:42
【问题描述】:
我刚刚在我的 Macbook 上安装并配置了 Apache、MySQL、PHP 和 phpMyAdmin,以便拥有一个本地开发环境。但是在我将我的一个项目转移到本地服务器后,我从我对 mysql_query() 的一次调用中得到了一个奇怪的 MySQL 错误:
拒绝用户访问 '_securityagent'@'localhost'(使用 密码:否)
首先,我发送给 MySQL 的查询都是有效的,我什至通过 phpMyAdmin 对其进行了测试,结果完美。其次,错误消息只发生在这里,而我每页至少有 4 个其他 mysql 连接和查询。对 mysql_query() 的调用发生在一个非常长的函数的末尾,该函数处理新创建或修改的文章的数据。这基本上就是它的作用:
- 从文章表单中收集所有数据(标题、内容、日期等)
- 验证收集的数据
- 连接数据库
- 根据经过验证的文章数据动态构建 SQL 查询
- 在关闭连接之前向数据库发送查询
非常基本,我知道。我不认识用户名“_securityagent”,所以在快速搜索后,我从 Apple 开发者连接上的一篇文章中发现了这个,该文章谈到了一些随机错误:
Mac OS X 的安全基础架构通过运行其 GUI 解决了这个问题 作为特殊用户“_securityagent”的代码。
因此,正如 Frank 在 cmets 中所建议的那样,我在 mysql_connect() 调用中使用的所有变量上放置了一个 var_dump(),并且每次它返回正确的值(其中用户名当然不是“_securityagent”)。因此,我想知道是否有人知道为什么“securityagent”试图连接到我的数据库 - 以及当我调用 mysql_query() 时如何防止此错误发生。
【问题讨论】:
-
那么,对 mysql_connect() 的调用是什么样的?
-
是的,我已经在我的 PHP 库中将数据库处理和系统逻辑划分为不同的类。调用 mysql_query() 的类使用另一个类“dbManager”,它依次完成所有连接等。在 dbManager 中,我有一个名为 connect_db() 的函数,它读取一个在安装期间再次创建的配置文件。此配置文件包含主机地址、数据库、用户名和密码。在 dbManager 中,mysql_connect() 看起来很简单: mysql_connect($SYSTEM_DB_HOST, $SYSTEM_DB_USER, $SYSTEM_DB_PASS); @mysql_select_db($SYSTEM_DB);
-
您确定实际填充了各种 $SYSTEM_* 变量吗?如果没有,因此默认为 null,那么您将看到您所描述的行为:默认情况下,mysql_connect() 尝试使用操作系统用户名进行连接,而无需密码。在 $SYSTEM_* 上尝试 var_dump(),看看到底发生了什么。
-
刚刚在所有 $SYSTEM 变量调用 mysql_connect() 之前添加了 var_dump() 调用。他们都返回了正确的数据。它与我正在建立的连接数量有什么关系吗?
-
另外,我做一个空值检查,以便在我调用 mysql_connect 之前验证从配置文件中读取的变量。所以我发送到mysql_connect的登录信息一定是正确的。