PDO 绑定限制
PDO Binding Limit
所以我有以下
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());
}
并且 return 值为
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 还是什么?怎么回事?
您似乎在尝试绑定查询中的列,但不允许这样做。
准备好的语句很棒有两个原因:
- 它们将您的查询与您的数据值分开,防止任何 SQL 注入的可能性
- 它们允许对许多不同的数据多次使用相同的查询和查询执行计划,这样效率更高。
由于查询计划基于诸如使用了哪些列、哪些列上有可以使用的索引、从哪些表中检索数据等信息,因此查询计划特定于检索哪些列。对于SQL注入保护,还需要防止调用函数,或检索可能会或可能不会显示给用户的列,以防止数据泄漏。这两点都意味着带有绑定参数的准备好的语句不能提供除数据以外的任何内容,而列则不能。
这就是您在绑定列时遇到问题的原因 - 您的查询不会引发错误,因为您实际上可以比较两个不是列数据的值。
解决这个问题的一种有点讨厌的方法是为您要搜索的每一列都包含一个条件:
SELECT * FROM table
WHERE
(:column = "colA" and colA like :term)
OR (:column = "colB" AND colB like :term)
OR ...
;
所以我有以下
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());
}
并且 return 值为
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 还是什么?怎么回事?
您似乎在尝试绑定查询中的列,但不允许这样做。
准备好的语句很棒有两个原因:
- 它们将您的查询与您的数据值分开,防止任何 SQL 注入的可能性
- 它们允许对许多不同的数据多次使用相同的查询和查询执行计划,这样效率更高。
由于查询计划基于诸如使用了哪些列、哪些列上有可以使用的索引、从哪些表中检索数据等信息,因此查询计划特定于检索哪些列。对于SQL注入保护,还需要防止调用函数,或检索可能会或可能不会显示给用户的列,以防止数据泄漏。这两点都意味着带有绑定参数的准备好的语句不能提供除数据以外的任何内容,而列则不能。
这就是您在绑定列时遇到问题的原因 - 您的查询不会引发错误,因为您实际上可以比较两个不是列数据的值。
解决这个问题的一种有点讨厌的方法是为您要搜索的每一列都包含一个条件:
SELECT * FROM table
WHERE
(:column = "colA" and colA like :term)
OR (:column = "colB" AND colB like :term)
OR ...
;