PHP MySQL查询中的MySQL / Apache错误

时间:2008-08-05 21:45:11

标签: php mysql apache

我收到以下错误:

  

拒绝访问用户“apache”@“localhost”(使用密码: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的用户没有权限。我检查了两个。我仍然可以在软件的其他位置执行其他查询,并且我已经验证该帐户具有正确的权限。

11 个答案:

答案 0 :(得分:11)

  

如果它很重要,apache @ localhost不是我用来进入数据库的用户帐户的名称。我根本就没有任何名为apache的用户帐户。

如果是'apache @ localhost',则用户名未正确传递给MySQL连接。 'apache'通常是运行httpd进程的用户(至少在基于Redhat的系统上),如果在连接期间没有传递用户名,则MySQL使用任何人调用连接。

如果您在脚本中进行连接,而不是在被调用文件中进行连接,那么会出现同样的错误吗?

答案 1 :(得分:4)

将include()更改为require()。 如果“connect.php”文件不能是require()d,则脚本将失败,并发生致命错误,而 include()仅生成警告。如果您传递给mysql_connect()的用户名不是“apache”,则连接脚本的错误路径是获取此类错误的最常见方式。

答案 2 :(得分:2)

老兄答案是个大DUH!不幸的是,我花了一段时间才弄明白。您可能有一个像dbconnect()这样的函数,并且您正在使用包含文件中的变量来建立连接。 $ conn = mysql_connect($ dbhost,$ dbuser,$ dbpass)。

好吧,因为这是在函数内部,include文件中的变量需要传递给函数,否则函数将不知道$ dbhost,$ dbuser和$ dbpass是什么。解决这个问题的一种方法是将这些变量设置为全局变量,这样您的函数就可以获取它另一个不太安全的解决方案是写出你的主机,用户并传入mysql_connect函数。

希望这会有所帮助,但我遇到了同样的问题。

答案 3 :(得分:2)

不要忘记检查数据库错误日志。你应该能够看到你是否甚至击中了数据库。如果不是,则应检查框中的防火墙规则。在Linux机器上,您可以运行iptables -L来获取防火墙列表规则。

否则它将是纯访问问题。执行“select * from mysql.user”以查看是否在那里设置了apache用户。此外,我建议专门为您的应用创建一个帐户,而不是使用apache,因为您创建的任何其他应用程序默认情况下将作为apache运行,并且可能会未经授权访问您的数据库。

只需在@ dev.mysql.com文档中查找“GRANT”即可获取更多信息。如果您对db有更具体的问题,请编辑您的问题,我会看看。

答案 4 :(得分:2)

connect.php脚本是否实际建立了连接,还是仅定义了需要调用以创建连接的函数?您得到的错误表明根本没有先前建立的连接。

ETA:还要将include更改为require。我怀疑它根本不包括文件。但是包括可以无声地失败。

答案 5 :(得分:1)

你还记得吗:

flush privileges;

如果用户未设置,则会出现'apache'@'localhost'错误。

答案 6 :(得分:1)

要检查一下,如果你使用只是这部分,你会收到错误吗?

<?php
include("../includes/connect.php");

$query = "SELECT * from story";
$result = mysql_query($query) or die(mysql_error());

如果是这样,如果您将其中一个插入内容复制并粘贴到此页面中,您仍然会收到错误,我正在尝试查看它是否是页面本地或实际行。

此外,您是否可以发布连接调用的副本(减去密码),除非插入使用与此示例完全相同的语法。

答案 7 :(得分:1)

apache用户是否需要密码才能连接到数据库?如果是这样,那么它说“使用密码:否”的事实会让我相信代码试图在没有密码的情况下进行连接。

但是,如果apache用户不需要密码,则仔细检查权限可能是个好主意(您提到已经检查过)。在mysql提示符下尝试执行类似的操作可能仍然是有益的:

GRANT ALL PRIVILEGES ON `*databasename*`.* to 'apache'@'localhost';

该语法应该是正确的。

除此之外,我和你一样难过。

答案 8 :(得分:1)

如果确实能够使用相同的连接调用进行插入,则问题很可能在于用户“apache”对数据库没有SELECT权限。如果安装了phpMyAdmin,则可以在“权限”窗格中查看该用户的权限。 phpMyAdmin还可以很容易地修改权限。

如果您只能访问命令行,则可以检查mysql数据库的权限。

您可能需要执行以下操作:

GRAND SELECT on myDatabase.myTable TO'apache'@'localhost';

答案 9 :(得分:1)

  

只是为了检查一下,如果你只使用这个部分就会出错?

     

如果是这样,如果您将其中一个插入内容复制并粘贴到此&gt;页面中,您仍然会收到错误,我正在尝试查看它是否是页面本地或实际行。

     

此外,您是否可以发布连接调用的副本(减去密码),除非插入&gt;使用与此示例完全相同的语法。

这是connection.php文件中的内容。我通过include以与在代码中其他位置执行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的用户帐户。

答案 10 :(得分:1)

您可以执行以下操作之一:

  • 添加用户“apache”并从phpmyadmin设置其权限或在shell上使用mysql
  • 告诉php以另一个用户身份运行mysql_connect,已经拥有所需权限的人(但可能不是root用户),在php.ini文件中查找mysql.default_user。