这个问题首先发布到堆栈溢出,但因为它也许是一样的服务器问题,我虽然也可以在这里发布它也是。
我刚刚在我的Macbook上安装并configuration了Apache,MySQL,PHP和phpMyAdmin,以便拥有本地开发环境。 但是当我把我的一个项目移到本地服务器后,我从我的一个调用mysql_query()中得到一个奇怪的MySQL错误:
访问拒绝用户'_securityagent'@'localhost'(使用密码:否)
首先,我发送到MySQL的查询是有效的,我甚至通过phpMyAdmin testet完美的结果。 其次,错误消息只发生在这里,而我有至less4个其他的MySQL连接和查询每页。 这个对mysql_query()的调用发生在处理新创build或修改的文章数据的一个非常长的函数的末尾。 这基本上是这样做的:
很基本,我知道。 我没有认识到用户名“_securityagent”,所以经过一个快速的search,我遇到了这个和苹果的开发者连接文章谈论一些随机的bug:
Mac OS X的安全基础架构通过以特殊用户“_securityagent”运行其GUI代码来解决此问题。
然后,我试着在mysql_connect()调用中使用的所有variables上放一个var_dump(),并且每次都返回正确的值(当然用户名不是“_securityagent”)。 因此,我想知道是否有人有任何想法为什么'securityagent'试图连接到我的数据库 – 当我调用mysql_query()我怎么能保持这个错误发生。
更新:这是我用来连接到数据库的确切代码。 但是有一点必须解释:
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是否有权执行以下查询:
然后确保列出的每一个都给予用户你认为他们将需要的权利。
然后,您应该可以执行查询。
尝试像这样:
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);