PHP PDO:如果我传递带有可变参数的查询,如何转义?

PHP PDO: how to escape if I pass a query with variable parameters?

我正在尝试使用新的 PDO 代码升级我的旧代码。

我曾经在我的主 Class 中有一个通用函数 DoQuery($query);,比如我的类,所以我可以从任何页面简单地调用它 喜欢

$q = "select * from table where name = 'john' "
$result = $myclass->DoQuery($q); // returns an array i can loop

我当前的密码是

function DoQuery($query, $assoc=0){

        try {
            $pdo = new PDO('mysql:host='.$this->sql["db_host"].';dbname='.$this->sql["db_data"], $this->sql["db_login"], $this->sql["db_pass"]);        
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $stmt = $pdo->prepare($query); 
            $stmt->execute(); 
        } catch(Exception $e) {//print error }

        if ($assoc){
            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
        }  else{
            $rows = $stmt->fetchAll(PDO::FETCH_NUM); 
        } 
        return $rows;
}

所以我不明白如果我有可变参数(如本例中的 'name' 但可以是任何参数),我该如何安全地转义输入?

除非我误打断了你的问题,否则应该这样做..

$q = "select * from table where name = ?";
$params = array('john');
$result = $myclass->DoQuery($q, 0, $params); // returns an array i can loop

然后更新你的函数...

function DoQuery($query, $assoc=0, $params=array()){
   $pdo = new PDO('mysql:host='.$this->sql["db_host"].';dbname='.$this->sql["db_data"], $this->sql["db_login"], $this->sql["db_pass"]);        
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $stmt = $pdo->prepare($query); 
    $stmt->execute($params);
    } catch(Exception $e) {//print error }
    if ($assoc){
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    }  else{
        $rows = $stmt->fetchAll(PDO::FETCH_NUM); 
    } 
    return $rows;
}

这是关于该主题的另一个讨论帖。 PHP PDO prepared statements