繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM