[英]LIKE statement and special characters in PDO / PHP
我已经检查过这样的问题的答案(如何在PHP中使用LIKE语句创建PDO参数化查询) 。 我最终得到了这个解决方案:
$sql = "SELECT count(*) ".
"FROM mytable ".
"WHERE num_certif LIKE CONCAT('%',:val,'%')";
$valeur = 'azert';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':val', $val);
这有效,但这是我的问题:我如何处理' % '字符? (即$ valeur ='%';返回所有行)?
你需要转义%字符,
$valeur = '\%';
注意PostgreSQL用户...而不是你可以使用的CONCAT功能
SELECT count(*)
FROM mytable
WHERE num_certif LIKE '%' || :val || '%'
我使用字符串比较函数实现了:
WHERE INSTR(LCASE(num_certif),LCASE(:val))>0
我怀疑表现会受到影响。
我一直在使用非常简单的东西,像这样:
$select_str = "SELECT * FROM table_x WHERE text_field LIKE '%".$value."%'";
$StHandler = $this->dbHandler->prepare($select_str);
$StHandler->execute();
根据您的要求,您只能使用一个百分比。 例如,如果您希望它以您的值开头并且稍后有任何字符,您将使用'“。$ value。”%'“
希望这可以帮助
为了避免必须进行自己的转义,需要转义的东西必须是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服务器场比扩展数据库服务器要容易得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.