将普通SQL语句转换为预准备语句

时间:2016-02-03 12:55:32

标签: php mysql

我使用的是PHP 7,MySQL。我已经为我的项目编写了很长时间,现在有数以千计的MySQL查询。那时我不知道准备好的陈述。

现在,为了避免SQL注入,我想使用预处理语句,但我很难将它们全部逐个转换为预处理语句。

有什么方法可以解析一个普通语句并使用PHP自动将其转换为预处理语句?对于每个MySQL查询,我都会在传递给MySQL命令之前将其传递给PHP函数。

public function dbquery($query,$dbname,$dbclose="-1")
{   
        $this->mysqli->select_db($dbname);
        $GLOBALS["dbr_total"]++;$GLOBALS["dbr_query"]++;
        $colarr=Array();$tares=Array();
    if ($result = $this->mysqli->query($query))
    {
        $GLOBALS["dbretry"]=0;
        $finfo = $result->fetch_fields();
        $c=0;
        foreach ($finfo as $val)
        {
            $colarr[$c]=$val->name;//get all colum names in this array
            $c++;
        }
        $co=0;
        while($obj = $result->fetch_object())
        {
            for($k=0;$k<count($colarr);$k++)
            {
                $elem=$colarr[$k];
                $tares[$co][$elem]=$obj->{$colarr[$k]};
            }
            $co++;
        }
        if($co==0)
        {
            $GLOBALS["dbretry"]=0;
            if($dbclose!="-1"){$this->dbclose();}
            return EMPTY_RESULT;
        }
    }
    else
    {
        if($GLOBALS["dbretry"]>3)
        {
            $GLOBALS["dbretry"]=0;
            $errmsg=$this->mysqli->error;
            $errno=$this->mysqli->errno;
            if($dbclose!="-1"){$this->dbclose();}
            $errobj=new ta_errorhandle();
            $errobj->senderror("OOPS! Could Not process your query!".$errmsg,$errno,"1");
        }
        else
        {
            $GLOBALS["dbretry"]++;
            $this->dbquery($query,$dbname);
        }
    }
        //QUERY DONE
        if($dbclose!="-1"){$this->dbclose();$result->close();}
        unset($obj);unset($finfo);unset($query);unset($result);unset($colarr);unset($c);unset($co);
        return $tares;
}




public function dbinsert($query,$dbname,$dbclose="-1")
{   
    $this->mysqli->select_db($dbname);
    $GLOBALS["dbr_total"]++;;$GLOBALS["dbr_insert"]++;
    if (!$this->mysqli->query($query))
    {
        $errmsg=$this->mysqli->error;
        $errno=$this->mysqli->errno;

        die("<br><br>".$errmsg."<br><br>".$errno);

        if($GLOBALS["dbretry"]>3)
        {
            $GLOBALS["dbretry"]=0;
            $logobj=new ta_logs();
            $logobj->store_templogs("PROBLEM EXECUTING QUERY:".$query." ON ".$dbname);
            return $this->mysqli;
        }
        else
        {
            $GLOBALS["dbretry"]++;
            $this->dbinsert($query,$dbname);
        }
    }
    else
    {
        $GLOBALS["dbretry"]=0;
    }
    if($dbclose!="-1"){$this->dbclose();}
    return SUCCESS;
}

现在我所做的就是调用$dbobj->dbquery("my query","database name");,其中$ dbobj是这些函数类的对象。

如何转换这些函数,以便使用我作为参数接收的任何查询并将其转换为预处理语句?我无法重写代码中的每个查询。我已经写了超过10,000个查询。

1 个答案:

答案 0 :(得分:0)

问题是您似乎将整个查询作为字符串传递给dbquery()方法。

预准备语句仅在将值作为参数传递给查询时防止sql注入,而不是在查询中已经存在该值时。

由于您的整个查询都是单个字符串,没有占位符且没有单独传递值,因此您无法使用预准备语句来防止sql注入,而无需更改将查询和参数传递给dbquery()方法的方式。因此,如果要利用预准备语句的sql预防功能,则需要重写查询。