我正试图用新的PDO代码升级我的旧代码。
我曾经在我的主类中有一个通用函数DoQuery($query);
,比如myclass,所以我可以简单地从任何页面调用它像
$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准备的语句