我已经检查了this one (How do I create a PDO parameterized query with a LIKE statement in PHP)等问题的答案。 我最终得到了这个解决方案:
$sql = "SELECT count(*) ".
"FROM mytable ".
"WHERE num_certif LIKE CONCAT('%',:val,'%')";
$valeur = 'azert';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':val', $val);
这有效,但这是我的问题:如何处理'%'字符? (即$ valeur ='%';返回所有行)?
答案 0 :(得分:4)
您需要转义%字符
$valeur = '\%';
答案 1 :(得分:2)
注意PostgreSQL用户...而不是CONCAT功能,你可以使用
SELECT count(*)
FROM mytable
WHERE num_certif LIKE '%' || :val || '%'
答案 2 :(得分:0)
我一直在使用非常简单的东西,比如:
$select_str = "SELECT * FROM table_x WHERE text_field LIKE '%".$value."%'";
$StHandler = $this->dbHandler->prepare($select_str);
$StHandler->execute();
根据您的要求,您只能使用一个百分比。例如,如果您希望它以您的值开头并且稍后有任何字符,您将使用'“。$ value。”%'“
希望这有帮助
答案 3 :(得分:-1)
为了避免必须进行自己的转义,需要转义的东西必须是pdo保护的数据的一部分,即绑定的参数。它不能保护您免受硬编码查询中的任何操作。
$sql = "SELECT count(*) ".
"FROM avs_souscript ".
"WHERE num_certif =\"\" ".
"AND date_annul=\"\" ".
"AND user=:sess_user ".
"AND user!=\"\" ".
"AND num_certif LIKE :num_certif_search";
$valeur = 'azert'; //I assume this actually came from some user input
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':num_certif_search', '%'.$valeur.'%');
(或者你可以将它们放在$valuer = "%{$userInput}%";
赋值中,无论哪种方式,它们都应该在绑定参数中,而不是在sql中。
将这个傻字符串连接从sql移出到php也是制作可伸缩应用程序的好习惯。扩展Web服务器场比扩展数据库服务器要容易得多。