[英]String comparison in SQLite not working when string contains '&'
我迷失了方向。 在SQLite Manager(FF插件)中執行時,此查詢工作正常(查找一條匹配記錄):
SELECT * FROM VendorDB WHERE lower(CompanyName) = 'b&b'
但是這個雜亂無章的SELECT語句(在回顯時與上面完全相同)找不到任何東西。
SELECT * FROM VendorDB WHERE lower(CompanyName) = [vendor variable containing 'b&b]
當字符串不包含“&”時,兩個查詢的工作方式相同。 我到處搜尋Google,卻找不到任何有關為何查詢無法持續運作的信息。
順便說一句,我正在使用PHP:PDO執行查詢。
EDIT_1:這是處理查詢的方式(在實現@Phil的建議之后),其中$ dbh是數據庫連接:
$qry = "SELECT * FROM VendorDB WHERE lower(CompanyName) = ?";
//[$vendor is the variable containing 'b&b]
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$go_fetch = $dbh->prepare($qry);
$go_fetch->bindParam(1,$vendor);
$go_fetch->execute();
並將結果檢索為:
$go_fetch->setFetchMode(PDO::FETCH_ASSOC);
$data = $go_fetch->fetchAll();
所有這些都產生一個空數組,但是應該產生一個且只有一個記錄。
還要注意,在插入查詢之前,我已經對變量$ vendor的值進行了回顯,它是正確的值(即'b&b'而不是'b&b'
)
如我上面的評論中所述,請使用適當的參數化語句。 例如...
$qry = "SELECT * FROM VendorDB WHERE lower(CompanyName) = ?";
$go_fetch = $dbh->prepare($qry);
然后,將參數傳遞給execute
方法
$go_fetch->execute([$vendor]);
或先綁定它,然后執行
$go_fetch->bindParam(1, $vendor);
$go_fetch->execute();
我非常懷疑&符是否會引起任何問題。 我找不到任何引用作為SQLite特殊字符。
我想說的問題是,該值實際上包含b&b
或包含其他問題字符,例如'
。 前者指示在哪里以及如何設置$vendor
變量時出現問題。 后者可以通過我上面的答案解決。
我已經解決了這個問題。 就我而言,這是一個愚蠢的錯誤,但是在這里記住答案,以防它對其他人有用。
問題的確確實是將“&”符號轉換為“&”。 (感謝@CBroe提供線索!)很難檢測到,因為它沒有出現在我正在查看的任何瀏覽器輸出中(包括查看頁面源代碼)。
很久很久以前,我已經忘記了我已經建立了一個標准的表單處理功能來“清除”所有POST數據。 該函數中的一行接受每個發布的值,並將htmlspecialchars()函數應用於該值。 這將“ b&b”轉換為“ b&b”。 非常適合HTML回顯的輸出,不適用於數據庫比較字符串。
對於此特定應用程序,如果我不應用htmlspecialchars(),則無論PDO的實現方式如何,一切都會按預期工作。
重新學習了課程……永遠不要忘記您建立的“默認值”!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.