PHP Mysql_query在函数内部不起作用

时间:2012-12-25 16:54:54

标签: php mysql scope global

我的问题是,当我在全局范围内使用mysql时,它可以正常工作,但在它里面却没有,请看看代码:

//connect.php
@mysql_connect($mysql_server, $mysql_admin, $mysql_pass);
@mysql_select_db($mysql_db);

//main.php
require_once("connect.php");
$rReq = $_REQUEST["req"];

function failed()
{
        $qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'");
        $ro = mysql_fetch_row($qe);
        $ro[0]+=1;
        mysql_query("UPDATE db SET success_count = '".$ro[0]."' WHERE serial='".$rReq."'");
}

//main code
failed(); // not works, mysql_query does nothing

//if i put here the same code but outside the function it works :/
$qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'");
$ro = mysql_fetch_row($qe);
$ro[0]+=1;
mysql_query("UPDATE db SET success_count = '".$ro[0]."' WHERE serial='".$rReq."'");

3 个答案:

答案 0 :(得分:1)

$rReq变量未在函数范围内定义,这就是失败的原因。 如果可能,您应该将它作为参数传递给函数。

我也建议不要压制任何错误。这被认为是不好的做法,如果你有错误报告,“未定义的变量......”错误会帮助你。

答案 1 :(得分:1)

您没有在查询中进行任何错误检查,因此毫不奇怪它在没有告诉您出错的情况下失败。这应该是第一件要解决的问题。有关如何添加正确的错误检查,请参阅manualthis question。此外,@会在连接时删除错误消息 - 删除它们,您将获得有关错误的信息。

正如您所说,您的具体问题与scope有关。您需要将所需的所有变量传递给函数,例如:

function failed($rReq, $qe)
  { 
   ....
  }

另请注意,您的代码容易受到SQL injection的攻击,这非常危险。

mySQL扩展已经过时了,开始用它编写新代码并不是一个好主意。考虑切换到PDO - 我知道在学习新东西时这是一个额外的压力,但它真的值得额外的努力!

答案 2 :(得分:0)

为了使$rReq变量在函数内部可见,您需要在那里声明它,将其作为参数传递,或使用global将其拉入:

function failed()
{
    global $rReq;
    $qe = mysql_query("SELECT success_count FROM db WHERE serial='".$rReq."'");
    ...

函数外部的变量不会在其中自动显示,函数内部的变量在其外部不可见。