簡體   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