PHP MySQL查询中的MySQL/Apache错误

Translate

我收到以下错误:

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

而且,即使有关系,apache @ localhost也不是我用来进入数据库的用户帐户的名称。就此而言,我根本没有名称为apache的用户帐户。

如果说“ apache @ localhost”,则用户名未正确传递到MySQL连接。 “ apache”通常是运行httpd进程的用户(至少在基于Redhat的系统上),并且如果在连接期间未传递用户名,则MySQL将使用调用该连接的人。

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

来源
Translate

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

来源
Zak
Translate

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

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

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

来源
Translate

connect.php脚本实际上是建立连接还是仅定义您需要调用以创建连接的函数?您收到的错误是完全没有先前建立的连接的症状。

预计到达时间:也将包含更改为要求。我怀疑它实际上根本没有包含文件。但是include可以默默地失败。

来源
Cedric Lee
Translate

杜德的答案是大DUH!不幸的是,我花了一段时间才弄清楚。您可能具有类似dbconnect()的功能,并且正在使用包含文件中的变量进行连接。 $ conn = mysql_connect($ dbhost,$ dbuser,$ dbpass)。

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

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

来源
Translate

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

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

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

将myDatabase.myTable上的GRANT SELECT选为'apache'@'localhost';

来源
Translate

您是否记得要做过:

flush privileges;

如果未设置用户,则将显示“ apache” @“ localhost”错误。

来源
Translate

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

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

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

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

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

来源
Translate

只是检查一下,如果仅使用此部分,则会出现错误?

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

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

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

来源
Newman Lee
Translate

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

  • 添加用户“ apache”并通过phpmyadmin或在shell上使用mysql设置其特权
  • 告诉php运行mysql_connect作为另一个用户,已经有需要的权限(但可能不是root用户),请在您的php.ini文件中查找mysql.default_user。
来源
Translate

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

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

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

该语法应该是正确的。

除此之外,我和你一样受挫。

来源