MySQL MySQL查询中的MySQL/Apache错误

in_ut 发布于 2018-02-25 mysql 最后更新 2018-02-25 01:12 812 浏览

我收到以下错误:

Access denied for user 'apache'@'localhost' (using password: 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的用户没有权限。我已经检查了两个。我仍然可以在软件的其他地方执行我的其他查询,并且我已验证该帐户具有正确的权限。
已邀请:

ut_et

赞同来自:

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

<?php
include("../includes/connect.php");
$query = "SELECT * from story";
$result = mysql_query($query) or die(mysql_error());
如果是这样,如果将这些插入内容中的一个复制并粘贴到此页面中,是否还会出现错误,我正在尝试查看它是否位于页面或实际行的本地。 另外,您可以发布连接调用的副本(减去密码),除非插入的语法与此示例完全相同。

hquia

赞同来自:

apache用户是否需要密码才能连接到数据库?如果是这样,那么它说“使用密码:否”的事实会导致我相信代码尝试连接时没有密码。 但是,如果apache用户不需要密码,那么仔细检查权限可能是一个好主意(你提到你已经选中了)。在mysql提示符下尝试执行这样的操作可能仍然有好处:

GRANT ALL PRIVILEGES ON databasename.* to 'apache'@'localhost';
该语法应该是正确的。 除此之外,我就像你一样难住。

oqui

赞同来自:

如果确实可以使用相同的连接调用来插入,则问题很可能在于用户“apache”对数据库没有SELECT权限。如果您安装了phpMyAdmin,您可以在“权限”窗格中查看用户的权限。 phpMyAdmin也使修改权限变得非常简单。 如果您只能访问命令行,则可以从mysql数据库中检查权限。 您可能需要执行以下操作: GRANT SELECT ON myDatabase.myTable TO'apache'@'localhost';

in_ut

赞同来自:

Just to check, if you use just this part you get an error? If so, do you still get an error if you copy and paste one of those Inserts into this >page, I am trying to see if it's local to the page or that actual line. Also, can you post a copy of the connection calls (minus passwords), unless the inserts >use exactly the same syntax as this example.
这是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的用户帐户。

uut

赞同来自:

And if it matters at all, apache@localhost is not the name of the user account that I use to get into the database. I don't have any user accounts with the name apache in them at all for that matter.
如果它说'apache @ localhost',则用户名不能正确传递到MySQL连接。 'apache'通常是运行httpd进程的用户(至少在基于Redhat的系统上),并且如果在连接期间没有传递用户名,MySQL会使用任何呼叫该连接的用户。 如果您在脚本中正确执行连接,而不是在被调用的文件中,您是否得到相同的错误?

seaque

赞同来自:

不要忘记检查你的数据库错误日志。你应该能够看到你是否击中了数据库。如果你不是,你应该检查你的防火墙规则。在Linux机器上,您可以运行iptables -L来获取防火墙列表规则。 否则,这将是一个纯粹的访问问题。做一个“从mysql.user中选择*”来查看apache用户是否被安装在那里。此外,我会建议创建一个专门为您的应用程序的帐户,而不是使用apache,因为您创建的任何其他应用程序默认情况下将运行为apache,并可能未经授权访问您的数据库。 只需在文档@ dev.mysql.com中查找“GRANT”即可获取更多信息。如果你有关于db的更具体的questiosn,只需编辑你的问题,我会看看。

zomnis

赞同来自:

connect.php脚本实际上是建立连接还是仅仅定义一个你需要调用来创建连接的函数?你得到的错误是没有先前建立的连接的症状。 ETA:将包含更改为需求。我怀疑它实际上并不包括文件。但包括可以默默地失败。

laut

赞同来自:

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

funde

赞同来自:

Dude的答案是一个很大的DUH!不幸的是,我花了一段时间才弄清楚。您可能有一个像dbconnect()这样的函数,并且您正在使用包含文件中的变量来建立连接。 $ conn = mysql_connect($ dbhost,$ dbuser,$ dbpass)。 那么因为这是在函数内部,所以包含文件的变量需要传递给函数,否则函数将不知道$ dbhost,$ dbuser和$ dbpass是什么。解决这个问题的一种方法是使这些变量成为全局变量,以便您的函数可以将其提取出来另一个不太安全的解决方案是写出你的主机,用户并传入mysql_connect函数。 希望这可以帮助,但我有同样的问题。

funde

赞同来自:

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

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

dodit

赞同来自:

你记得要做什么:

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