MySQL/Apache在PHP MySQL查询中出现错误

29

我遇到了如下错误:

用户'apache'@'localhost'被拒绝访问(未使用密码)

使用以下代码时出现该问题:

<?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个回答

12
如果使用的是'apache @ localhost'作为用户名,那么MySQL连接并没有正确传递用户名。通常情况下(至少在基于Redhat系统上),apache是运行httpd进程的用户,如果在连接期间没有传递用户名,则MySQL使用发起连接的用户。如果您在脚本中正确进行连接而不是在被调用的文件中,是否会出现相同的错误?请注意HTML标记。

4

将include()更改为require()。如果无法require()“connect.php”文件,则脚本将失败并显示致命错误,而include()仅会生成警告。如果您传递给mysql_connect()的用户名不是“apache”,那么路径不正确会导致此类错误。


2
不要忘记检查数据库错误日志。您应该能够看到是否正在访问DB。如果没有,请检查盒子上的防火墙规则。在Linux盒子上,您可以运行iptables -L以获取防火墙列表规则。
否则,这将是一个纯访问问题。执行“select * from mysql.user”以查看是否在其中设置了apache用户。此外,我建议为您的应用程序创建一个帐户,而不是使用apache,因为您创建的任何其他应用程序都将默认运行为apache,并可能未经授权地访问您的db。
只需在dev.mysql.com上查找“GRANT”文档以获取更多信息。如果您对数据库有更具体的问题,请编辑您的问题,我会查看。

2

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

预计时间:同时将include更改为require。我怀疑它实际上根本没有包含文件。但是,包含可能会静默失败。


2
哥们,答案显而易见!不过我也花了一些时间才明白。你可能有一个名为dbconnect()的函数,并且在使用include文件中的变量进行连接时,$conn = mysql_connect($dbhost, $dbuser, $dbpass)。
由于这是在函数内部,因此需要将include文件中的变量传递给函数,否则函数将不知道$dbhost、$dbuser和$dbpass是什么。解决方法之一是使这些变量全局化,以便您的函数可以调用它们。另一个解决方法(不太安全)是在mysql_connect函数中直接写出主机、用户和密码。
希望这能帮到你,我也曾遇到同样的问题。

我最终弄明白了事情,后来感觉自己像个大傻瓜。唉!有时候,我也会有这样的时刻。再次感谢! - Mesidin

1

仅仅是检查一下,如果你使用只有这一部分会出现错误吗?

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

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

如果是这样,如果您将其中一个插入复制并粘贴到此页面中,是否仍会出现错误?我想知道它是页面本地的还是实际行的问题。

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


1

Apache用户连接数据库需要密码吗?如果是的话,那么它显示“using password: NO”的事实会让我相信代码正在尝试不使用密码进行连接。

然而,如果Apache用户不需要密码,建议再次检查权限(您已经提到过)。在mysql提示符下尝试执行以下内容仍然可能有益:

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

那个语法应该是正确的。

除此之外,我和你一样困惑。


我认为那不是一个好的解决方案。这就像是说,如果你造了一辆汽车,方向盘掉落了,人们撞上了树,解决方案就是移除树木一样。这明显是连接没有正确初始化的问题。 - nickf

1

你记得要做:

flush privileges;

如果用户没有设置,则会出现“apache'@'localhost”错误。

也许你的回答更适合作为评论给出。 - boisvert

1
您可以选择以下操作之一:
  • 通过phpmyadmin或在shell上使用mysql添加用户“apache”并设置其权限
  • 告诉php将mysql_connect运行为另一个用户,即已拥有所需权限(但可能不是root)的用户,在php.ini文件中查找mysql.default_user。

1

如果您确实可以使用相同的连接调用进行插入操作,那么问题很可能出在用户"apache"在数据库上没有SELECT权限。如果您安装了phpMyAdmin,您可以查看"Privileges"选项卡中用户的权限。phpMyAdmin还可以非常方便地修改权限。

如果您只能通过命令行访问,您可以从mysql数据库中检查权限。

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

GRANT SELECT ON myDatabase.myTable TO 'apache'@'localhost';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接