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 的用户没有权限有关。我都检查过了。我仍然可以在软件的其他地方执行我的其他查询,并且我已验证该帐户具有正确的权限。

4

11 回答 11

12

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

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

如果您在脚本中而不是在调用的文件中进行连接,您会得到相同的错误吗?

于 2008-08-06T00:05:34.790 回答
4

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

于 2008-10-21T18:30:18.767 回答
2

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

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

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

于 2008-10-21T17:53:03.850 回答
2

connect.php 脚本是否真的建立了连接,或者它只是定义了一个您需要调用来创建连接的函数?您遇到的错误是完全没有先前建立的连接的症状。

ETA:还将包含更改为要求。我怀疑它实际上根本不包括该文件。但是包含可能会默默地失败。

于 2008-10-21T17:57:06.150 回答
2

伙计,答案是一个大的DUH!不幸的是,我也花了一段时间才弄清楚。您可能有一个类似 dbconnect() 的函数,并且您正在使用包含文件中的变量来建立连接。$conn = mysql_connect($dbhost, $dbuser, $dbpass)。

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

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

于 2009-03-02T19:47:10.743 回答
1

只是为了检查,如果你使用这部分你会得到一个错误?

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

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

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

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

于 2008-08-05T21:52:44.123 回答
1

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

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

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

该语法应该是正确的。

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

于 2008-08-05T21:56:20.607 回答
1

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

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

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

GRANT SELECT ON myDatabase.myTable TO 'apache'@'localhost';
于 2008-08-05T22:02:23.777 回答
1

只是为了检查,如果你只使用这部分你会得到一个错误?

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

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

这是 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 的用户帐户。

于 2008-08-05T22:40:40.720 回答
1

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

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

您是否记得这样做:

flush privileges;

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

于 2013-09-19T10:46:15.757 回答