在php中执行mysql_query时获取访问被拒绝错误

时间:2011-08-21 04:06:36

标签: php mysql

警告我的php文件..

  

警告:mysql_query()[function.mysql-query]:在C:\ Program Files \ xampp \ htdocs \ shadaab \ register.php中拒绝用户'ODBC'@'localhost'(使用密码:NO)的访问权限第25行

     

警告:mysql_query()[function.mysql-query]:无法在第25行的C:\ Program Files \ xampp \ htdocs \ shadaab \ register.php中建立到服务器的链接   用户'ODBC'@'localhost'的访问被拒绝(使用密码:NO)

我的连接文件:

$localhost='localhost';
$username='root';
$password='';
$dbname='school';

$con=mysql_connect('$localhost','$username','$password');
mysql_select_db('$dbname',$con);

3 个答案:

答案 0 :(得分:6)

最终更新:

我打开了与Aditii的聊天会话,我们在那里做了一些调试。

事实证明,问题在于她已经从启用了短标签的服务器升级到没有启用短标签的服务器。结果,她的所有代码都被包含在短标签中,并没有被执行,这包括她的配置文件。

问题中的错误是由于没有执行mysql_connect()函数,因为整个文件没有被执行。依赖于该连接的mysql_query()调用因此而失败。

在纠正她的短标签以使用完整的<?php标签后,该文件已执行。正如我在这个问题的原始答案中所讨论的那样,传递给mysql_connect()的变量的单引号最终导致了问题。在建议删除这些单引号后,连接成功,问题得到解决。

可以找到任何感兴趣方的整个调试会话here


第一次更新:

在仔细观察之后,有两件不符合我原来的反应(我已经保留在这个答案的底部,因为它仍然有一些好的信息)。

首先,错误由mysql_query()而不是mysql_connect()触发。这可能是因为连接周围没有错误处理,因此错误直到稍后才会被注意到。尝试在连接周围添加一些错误处理:

if (!($con = mysql_connect('$localhost','$username','$password'))) {
  echo mysql_error();
}

if (!mysql_select_db('$dbname',$con)) {
  echo mysql_error();
}

在上文中,错误发生后将立即显示错误。

我看到的第二件事是您与localhost用户正在连接ODBC。如果错误是由您在上面显示的连接代码触发的,那么无意义。如果您的问题是我在下面解释的单引号问题,您将使用名为$username的用户登录,如果不是,则为root

看起来PHP正在尝试连接PHP设置的默认凭据(在php.ini文件中找到),而不是您提供的凭据。这让我相信你向我们展示的线条实际上并不是正在执行的线条。你确定你没有尝试连接代码中的其他地方吗?如果你是,我怀疑你的错误在于代码的那一部分。

当你尝试针对空连接运行mysql_query()时,也可能(我必须检查),也许PHP正在尝试为您创建连接。我不会指望那个。

我建议您尝试运行我上面提供的更新代码,该代码使用mysql_error()函数在发生错误时显示错误。您甚至可以在这些块中添加自己的一些echo语句,以进行一些老式的printf调试。


原始答案:

问题在于您将变量包装在单引号内。如果用单引号将它们包装起来,PHP不会将变量计算为值。例如,不是将root作为第二个参数传递,而是传递$username。最后,您尝试使用名为$localhost且密码为$username的用户登录名为$password的服务器。

看看PHP documentation page for Strings。它解释了这一点:

  

注意:与双引号和heredoc语法不同,特殊字符的变量和转义序列在 时会被扩展单引号字符串。

如果要在字符串中使用变量,则需要使用 double 引号,而不是单引号。但是,在这种情况下,您根本不需要将这些变量包装在引号中,因为它们的值是已经字符串。您可以单独传递变量。试试这个:

$con=mysql_connect($localhost, $username, $password);
mysql_select_db($dbname, $con);

答案 1 :(得分:2)

你试图在没有密码的情况下连接到MySQL;试着把它放进去。

答案 2 :(得分:0)

用户是否有权执行它尝试访问的表上的查询?我意识到它是root用户,但是对于wahtever古怪的原因,它可能有权访问数据库,但没有权限执行SELECT / INSERT / UPDATE /对它的表或某些表执行任何类型的查询。