PDO mysql_real_escape_string如何在准备好的语句中使用

时间:2014-11-22 23:04:23

标签: php pdo

我正试图逃避我正在发表声明的字符串。

我知道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;
}

1 个答案:

答案 0 :(得分:0)

您不希望在已弃用的界面中使用mysql_real_escape_string

对于$direction,请确认其中包含DESCDESCENDING。否则将其设置为空字符串,或ASC

如果$order应包含标识符(列名),则可以使用反引号将其转义,并删除变量中的任何反引号,例如

  ... ORDER BY `".str_replace("`","",$order)."` $direction

如果$order包含表达式,那就有点棘手了。