我正试图逃避我正在发表声明的字符串。
我知道PDO准备和执行,(对于那些不知道PDO的人准备一个语句来阻止任何额外的命令被运行,所以语句知道它在运行变量数据之前它正在运行什么,从而消除了被存在的可能性注意)我此时的麻烦是我想运行一个带有变量的语句,该变量是MySQL规则的一部分(见下文)。
$sql = $this->PDO->prepare("SELECT * FROM `weight` WHERE `user_id`=:id ORDER BY $order $direction");
正如您所看到的,我正在使用ASC / DESC的自定义订单,上面的说法有效,但我觉得它不够安全。将方向作为switch语句很容易,但对于未来的扩展,我想逃避$ order而不是使用开关或硬编码数组。
我在$ order上以多种方式使用了mysql_real_escape_string,但声明不喜欢它,有什么想法吗?编辑----下面是完整的功能代码,不需要猜测工作..
public function getWeightByUserOrderBy($id, $order, $direction) {
$order1 = $PDO->quote($order);
$sql = $this->PDO->prepare("SELECT * FROM `weight` WHERE `user_id`=:id ORDER BY $order1 $direction");
$sql->execute(array(
":id" => $id
));
$sql = $sql->fetchall();
return $sql;
}
答案 0 :(得分:0)
您不希望在已弃用的界面中使用mysql_real_escape_string
。
对于$direction
,请确认其中包含DESC
或DESCENDING
。否则将其设置为空字符串,或ASC
。
如果$order
应包含标识符(列名),则可以使用反引号将其转义,并删除变量中的任何反引号,例如
... ORDER BY `".str_replace("`","",$order)."` $direction
如果$order
包含表达式,那就有点棘手了。