【问题标题】:MySQL/Apache Error in PHP MySQL queryPHP MySQL 查询中的 MySQL/Apache 错误
【发布时间】:2010-09-05 09:33:18
【问题描述】:

我收到以下错误:

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

【问题讨论】:

    标签: php mysql apache


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

            • 谢谢!我终于弄明白了,后来觉得自己像个大白痴。嗬!有时,我猜我有我的时刻。再次感谢!
            【解决方案6】:

            你还记得吗:

            flush privileges;
            

            如果用户没有设置,那么它会给出'apache'@'localhost'错误。

            【讨论】:

            • 也许你的答案最好作为评论给出。
            【解决方案7】:

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

            <?php
            include("../includes/connect.php");
            
            $query = "SELECT * from story";
            $result = mysql_query($query) or die(mysql_error());
            

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

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

            【讨论】:

              【解决方案8】:

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

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

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

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

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  【解决方案10】:

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

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

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

                  该语法应该是正确的。

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

                  【讨论】:

                  • 我认为这不是一个好的解决方案。这就像说,如果你制造了一辆方向盘掉了,人们撞到树上的汽车,解决办法就是把树移走。这绝对是连接未正确初始化的问题。
                  【解决方案11】:

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

                  如果你只有命令行权限,可以从mysql数据库中查看权限。

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-01-17
                    • 2018-11-10
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-11-13
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多