Mac OS X 上的 PHP 和 MySQL:GUI 用户访问被拒绝

Mac OS X 上的 PHP 和 MySQL:GUI 用户访问被拒绝

该问题首先发布到 Stack Overflow,但由于它可能只是一个服务器问题,因此我认为也最好将其发布在这里。

我刚刚在 Macbook 上安装并配置了 Apache、MySQL、PHP 和 phpMyAdmin,以便拥有本地开发环境。但是在我将我的一个项目移至本地服务器后,我在调用 mysql_query() 时收到一个奇怪的 MySQL 错误:

拒绝用户“_securityagent”@“localhost”访问(使用密码:否)

首先,我发送给 MySQL 的查询都是有效的,我甚至通过 phpMyAdmin 测试过,结果完美。其次,只有当我每页至少有 4 个其他 mysql 连接和查询时,才会出现错误消息。对 mysql_query() 的调用发生在一个非常长的函数的末尾,该函数处理新创建或修改的文章的数据。它基本上是这样做的:

  1. 收集文章形式的所有数据(标题、内容、日期等)
  2. 验证收集的数据
  3. 连接到数据库
  4. 根据经过验证的文章数据动态构建 SQL 查询
  5. 关闭连接之前向数据库发送查询

我知道这很简单。我不认识用户名“_securityagent”,所以在快速搜索后,我在 Apple 的 Developer Connection 上找到了这篇文章,其中讨论了一些随机错误:

Mac OS X 的安全基础设施通过以特殊用户“_securityagent”的身份运行其 GUI 代码来解决此问题。

然后我尝试将 var_dump() 放在 mysql_connect() 调用中使用的所有变量上,每次它都返回正确的值(当然,用户名不是“_securityagent”)。因此,我想知道是否有人知道为什么“securityagent”试图连接到我的数据库 - 以及如何在调用 mysql_query() 时避免发生此错误。

更新:这是我用来连接数据库的确切代码。但必须进行一些解释:

  1. 连接错误发生在 class_1 中函数 X 中对 mysql_query() 的调用
  2. class_1 使用 class_2 连接数据库
  3. class_2 读取包含数据库连接变量(主机、用户、密码、数据库)的配置文件
  4. 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);

相关内容