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

这个问题首先发布到堆栈溢出,但因为它也许是一样的服务器问题,我虽然也可以在这里发布它也是。

我刚刚在我的Macbook上安装并configuration了Apache,MySQL,PHP和phpMyAdmin,以便拥有本地开发环境。 但是当我把我的一个项目移到本地服务器后,我从我的一个调用mysql_query()中得到一个奇怪的MySQL错误:

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

首先,我发送到MySQL的查询是有效的,我甚至通过phpMyAdmin testet完美的结果。 其次,错误消息只发生在这里,而我有至less4个其他的MySQL连接和查询每页。 这个对mysql_query()的调用发生在处理新创build或修改的文章数据的一个非常长的函数的末尾。 这基本上是这样做的:

  1. 收集文章forms(标题,内容,date等)的所有数据。
  2. validation收集的数据
  3. 连接到数据库
  4. 基于validation的文章数据dynamic构buildSQL查询
  5. 在closures连接之前将查询发送到数据库

很基本,我知道。 我没有认识到用户名“_securityagent”,所以经过一个快速的search,我遇到了这个和苹果的开发者连接文章谈论一些随机的bug:

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

然后,我试着在mysql_connect()调用中使用的所有variables上放一个var_dump(),并且每次都返回正确的值(当然用户名不是“_securityagent”)。 因此,我想知道是否有人有任何想法为什么'securityagent'试图连接到我的数据库 – 当我调用mysql_query()我怎么能保持这个错误发生。

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

  1. 连接错误发生在class_1中函数X中对mysql_query()的调用中
  2. class_1使用class_2连接到数据库
  3. class_2用数据库连接variables(host,user,pass,db)读取configuration文件
  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; } } 

你怎么调用mysql_query() ? 我注意到你不保存mysql_connect()调用的连接句柄。 它看起来像失败的mysql_query()调用不使用你正在build立的连接。

我build议你修改你的代码来做这样的事情:

 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要使用哪个数据库连接是个好习惯。

你应该将你的凭据传递给mysql_connect 。

mysql_query()的调用可能正在拾取错误的连接,或试图打开一个新的连接; 尝试保存来自mysql_connect()的连接资源并将其明确地传递给mysql_query() 。 更好的是,考虑更新到更现代的驱动程序,如mysqli或PDO。 作为一个单独的testing(在另一个脚本中),尝试发出一个没有凭据的mysql_connect()mysql_query() ,看看是否得到相同的错误。

你是否validation过该用户能够执行查询? 如果您可以以root用户身份login到phpmyadmin,那么请validation用户_sercurityagent是否有权执行以下查询:

  • 本地主机
  • 盒子的IP地址
  • 回送

然后确保列出的每一个都给予用户你认为他们将需要的权利。

然后,您应该可以执行查询。

尝试像这样:

 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);