PHP MySQL 查询中的 MySQL/Apache 错误
Posted
技术标签:
【中文标题】PHP MySQL 查询中的 MySQL/Apache 错误【英文标题】:MySQL/Apache Error in PHP MySQL query 【发布时间】: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 的用户没有权限有关。我都检查过了。我仍然可以在软件的其他地方执行其他查询,并且我已验证该帐户具有正确的权限。
【问题讨论】:
【参考方案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';
【讨论】:
以上是关于PHP MySQL 查询中的 MySQL/Apache 错误的主要内容,如果未能解决你的问题,请参考以下文章