簡體   English   中英

當字符串包含“&”時,SQLite中的字符串比較不起作用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM