【问题标题】:PHP Mysql_query not works inside functionPHP Mysql_query 在函数内部不起作用
【发布时间】:2012-12-25 16:54:54
【问题描述】:

我的问题是,当我在全局范围内使用 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."'");

【问题讨论】:

  • 您应该在函数内使用global 关键字声明全局变量。没有这个变量,例如 $rReq,是局部变量(具有空值)。

标签: php mysql scope global


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您没有在查询中进行任何错误检查,所以难怪它会失败而不会告诉您出了什么问题。这应该是首先要解决的问题。请参阅manualthis question,了解如何添加正确的错误检查。此外,@ 将在连接时抑制错误消息 - 删除它们,您将获得有关问题的信息。

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

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

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

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

    【讨论】:

    • 谢谢,现在我明白了 :) 我使用了 $GLOBAL[]。这不是我的全部代码,我做的是 antisql 的事情。是的,这是我的错,因为我的服务器关闭显示错误
    【解决方案3】:

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

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

    函数外部的变量在函数内部不会自动可见,而函数内部的变量在函数外部不可见。

    【讨论】:

    • 虽然从技术上讲这回答了手头的问题,但您还应该提到 1) SQL 注入,2) mysql_ 弃用,以及可能 3) 这两个查询可以合并为一个的事实。
    • 上面的代码比这3个问题要多得多;这不是 codereview.stackexchange.com
    猜你喜欢
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多