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