PHP MySQL查询中的MySQL / Apache错误
我收到以下错误:
Access denied for user 'apache'@'localhost' (using password: NO)
使用以下代码时:
<?php include("../includes/connect.php"); $query = "SELECT * from story"; $result = mysql_query($query) or die(mysql_error()); echo "<h1>Delete Story</h1>"; if (mysql_num_rows($result) > 0) { while($row = mysql_fetch_row($result)){ echo '<b>'.$row[1].'</b><span align="right"><a href="../process/delete_story.php?id='.$row[0].'">Delete</a></span>'; echo '<br /><i>'.$row[2].'</i>'; } } else { echo "No stories available."; } ?>
" connect.php"文件包含我的MySQL连接调用,这些调用可以与软件另一部分中的" INSERT"查询一起正常工作。如果我注释掉$ result = mysql_query
行,那么它将转到else语句。因此,该行或者if中的内容。
我一直在网上寻找任何解决方案,大多数似乎与太多的MySQL连接有关,或者我登录到MySQL的用户没有权限。我都检查了。我仍然可以在软件的其他位置执行其他查询,并且我已验证该帐户具有正确的权限。
解决方案
回答
只是检查一下,如果仅使用此部分,则会出现错误?
<?php include("../includes/connect.php"); $query = "SELECT * from story"; $result = mysql_query($query) or die(mysql_error());
如果是这样,如果我们将其中一个插入内容复制并粘贴到此页面中,仍然会出现错误,我正在尝试查看它是否在页面或者该实际行的本地。
另外,是否可以发布连接调用的副本(减去密码),除非插入使用与本示例完全相同的语法。
回答
apache用户是否需要密码才能连接到数据库?如果是这样,那么它上面写着"使用密码:否"的事实会让我相信代码试图在没有密码的情况下进行连接。
但是,如果apache用户不需要密码,则仔细检查权限可能是一个好主意(我们提到我们已经检查过)。尝试在mysql提示符下尝试执行以下操作可能仍然是有益的:
GRANT ALL PRIVILEGES ON `*databasename*`.* to 'apache'@'localhost';
该语法应该是正确的。
除此之外,我和你一样受挫。
回答
如果确实能够使用相同的连接调用插入,则问题很可能是由于用户" apache"对数据库没有SELECT权限。如果安装了phpMyAdmin,则可以在"权限"窗格中查看用户的权限。 phpMyAdmin还使修改权限变得非常容易。
如果我们只能访问命令行,则可以从mysql数据库中检查权限。
我们可能需要执行以下操作:
将myDatabase.myTable授予GRANT SELECT到'apache'@'localhost';
回答
Just to check, if you use just this part you get an error? If so, do you still get an error if you copy and paste one of those Inserts into this >page, I am trying to see if it's local to the page or that actual line. Also, can you post a copy of the connection calls (minus passwords), unless the inserts >use exactly the same syntax as this example.
这是connection.php文件中的内容。我以与我在代码中其他位置执行INSERT查询相同的方式通过包含链接链接到文件。
$conn = mysql_connect("localhost", ******, ******) or die("Could not connect"); mysql_select_db("adbay_com_-_cms") or die("Could not select database");
我将尝试在该区域中正常工作的INSERT查询来检查一下。
至于其他有关密码访问的帖子。如我的第一篇文章所述,我确实检查了权限。我使用phpMyAdmin来验证我所使用的用户帐户的权限是否正确。而且,即使有关系,apache @ localhost也不是我用来进入数据库的用户帐户的名称。我根本没有名称为apache的用户帐户。
回答
And if it matters at all, apache@localhost is not the name of the user account that I use to get into the database. I don't have any user accounts with the name apache in them at all for that matter.
如果说" apache @ localhost",则用户名未正确传递到MySQL连接。 " apache"通常是运行httpd进程的用户(至少在基于Redhat的系统上),并且如果在连接期间未传递用户名,则MySQL将使用调用该连接的人。
如果我们直接在脚本中而不是在被调用文件中进行连接,是否会遇到相同的错误?
回答
不要忘记检查数据库错误日志。我们应该能够查看是否正在击中数据库。如果不是,则应在复选框上检查防火墙规则。在Linux上,我们可以运行iptables -L来获取防火墙列表规则。
否则,这将是一个纯粹的访问问题。执行"从mysql.user中选择*"以查看apache用户是否已在那里设置。此外,我建议我们为应用程序专门创建一个帐户,而不是使用apache,因为我们创建的任何其他应用程序默认都会以apache的身份运行,并且可能会未经授权地访问数据库。
只需在文档@ dev.mysql.com中查找" GRANT"即可获取更多信息。如果我们有关于db的更具体的问题,只需编辑问题,我会看一看。
回答
connect.php脚本实际上是建立连接还是仅定义我们需要调用以创建连接的函数?我们收到的错误是完全没有先前建立的连接的症状。
预计到达时间:也将包含更改为要求。我怀疑它实际上根本没有包含该文件。但是include可以默默地失败。
回答
将include()更改为require()。如果" connect.php"文件无法被require()d使用,则脚本将失败并显示致命错误,而include()仅生成警告。如果我们要传递给mysql_connect()的用户名不是" apache",则连接脚本的错误路径是获取此类型错误的最常见方法。
回答
杜德的答案是大DUH!不幸的是,我花了一段时间才弄清楚。我们可能具有类似dbconnect()的功能,并且正在使用包含文件中的变量进行连接。 $ conn = mysql_connect($ dbhost,$ dbuser,$ dbpass)。
好吧,因为这是在函数内部,所以需要将包含文件中的变量传递给函数,否则函数将不知道$ dbhost,$ dbuser和$ dbpass是什么。解决此问题的一种方法是使这些变量成为全局变量,以便函数可以使用它们。另一个不是很安全的解决方案是写出主机,用户并传递mysql_connect函数。
希望这会有所帮助,但我遇到了同样的问题。
回答
我们可以执行以下操作之一:
- 添加用户" apache"并通过phpmyadmin或者在shell上使用mysql设置其权限
- 告诉php以另一个用户(已经具有所需特权(但可能不是root))运行mysql_connect的情况下,在php.ini文件中查找mysql.default_user。