LIKE语句和PDO / PHP中的特殊字符

时间:2010-04-28 09:16:04

标签: php pdo sql-like

我已经检查了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 ='%';返回所有行)?

4 个答案:

答案 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服务器场比扩展数据库服务器要容易得多。