PDO绑定限制

时间:2015-04-19 00:16:26

标签: php pdo

所以我有以下

public function search($table, $column, $term, $limit = 5){
        $command = "SELECT name FROM `$table` WHERE `:col` LIKE :term LIMIT :lim";
        $query = $this->connection->prepare($command);
        $query->execute(array(":term"=>"%{$term}%", ':lim'=>$limit, ':col' => $column));
        print_r($query->fetchAll());
    }

,返回值为

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''5'' at line 1

从副本中,我将执行更改为此

$command = "SELECT name FROM `$table` WHERE ? LIKE ? LIMIT ?";

...
    $query->bindParam(1, $column,  PDO::PARAM_STR);
            $term = "%{$term}%";
            $query->bindParam(2, $term,  PDO::PARAM_STR);
            $query->bindParam(3, $limit,  PDO::PARAM_INT);
            $query->execute();

现在我得到了这个:

Array ( )

我的限制现在是0还是什么?发生了什么事?

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试绑定查询中的列,但您不允许这样做。

准备好的陈述很棒,原因有两个:

  1. 他们将您的查询与数据值分开,防止出现SQL注入的可能性
  2. 它们允许多次使用相同的查询和查询执行计划以及许多不同的数据,这样效率更高。
  3. 由于查询计划基于诸如使用哪些列之类的信息,哪些列具有可以使用的索引,从哪些表检索数据,查询计划特定于检索哪些列。对于SQL注入保护,还需要防止调用函数或检索可能会或可能不会向用户显示的列以防止数据泄漏。这两点都意味着带有绑定参数的预处理语句不能提供除数据之外的任何内容,而哪些列不是。

    这就是为什么您在绑定列时遇到问题 - 您的查询不会引发错误,因为您实际上已经允许比较两个不是列数据的值。

    一种有点讨厌的方法是为每个要搜索的列添加一个条件:

    SELECT * FROM table
    WHERE 
        (:column = "colA" and colA like :term) 
        OR (:column = "colB" AND colB like :term) 
        OR ...
    ;