我已经检查了如this one (How do I create a PDO parameterized query with a LIKE statement in PHP)这样的问题的答案。 我已经结束了该解决方案:PDO/Php LIKE声明和特殊字符问题
$sql = "SELECT count(*) ".
"FROM mytable ".
"WHERE num_certif LIKE CONCAT('%',:val,'%')";
$valeur = 'azert';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':val', $val);
这工作,但这里是我的问题:我该如何处理“%”字符? (即$ valeur ='%';返回所有行)?
是啊,我知道这一点。但是,如果你考虑一下原则:prepare()和bindValue()已经为优化*和*做了避免函数,例如mysql_real_escape(),escape()等等,所以如果我必须做一个str_replace('%',' \%'...)这意味着有一个(重要的)目标错过了,这就是为什么我寻找一个优雅的解决方案,而不是回到旧的“php safe_mode”时间 – 2010-04-29 14:04:52
我没有得到你的准备好的语句与通配符的语义没有任何关系,当用作准备语句的参数时,通配符不应改变它的含义 – 2010-04-29 14:55:50
我的意思是:旧代码=“select * from xx where t =”。mysql_real_escape(blabla)。“
新代码:prepare(“select * from xx where t =:tmp”)then bindValue(':tmp',$ val)。使用你的建议,这会给:bindValue(':tmp',str_replace('%','\%',$ val))。这对我来说不是干净的代码。我们不应该在这里使用str_replace()。必须有另一种方式,因为这种方式是“逃避不需要的字符”的原则,这是一个原则,**应该**不再存在,这要归功于prepare()和bindValue()。我希望我这次更清楚:) – 2010-04-30 09:33:59