2014-03-28 95 views
-1

我正在失去主意。此查詢工作正常時的SQLite管理器(FF插件)執行(找到一個匹配的記錄):當字符串包含'&'時,SQLite中的字符串比較不起作用

SELECT * FROM VendorDB WHERE lower(CompanyName) = 'b&b' 

但這variablized SELECT語句(這是完全一樣的,當上述出回顯)未找到任何東西。

SELECT * FROM VendorDB WHERE lower(CompanyName) = [vendor variable containing 'b&b] 

當字符串不包含一個「&」兩個查詢工作一樣。我已經搜索了所有內容,無法找到任何有關爲什麼查詢不應始終如一的工作。

順便說一句,我使用PHP:PDO來執行查詢。

EDIT_1: 下面介紹如何查詢被處理,其中$胸徑數據庫連接(實現從@Phil的建議後):

$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(); 

所有這些都會產生一個空數組,但應該只產生一個記錄。

另外請注意,我已經回顯變量$供應商的價值被插入查詢之前,它是正確值(即「B & B」不'b&b'

+0

是&也許是html實體'&'? – 2014-03-28 00:22:20

+1

_「這與上面的echo'd out完全相同」_ - 你是否確信......在第二個查詢中不是'&'? – CBroe

+0

來自哪裏的價值以及如何將其注入查詢?你應該使用'bindParam' /'bindValue'綁定它,或者將它傳遞給'execute'方法 – Phil

回答

1

我解決了這個問題。這是我的一個愚蠢的錯誤,但是如果對別人有用的話,在這裏記住答案。

問題的確在於'&'符號被轉換爲'&'。 (感謝@CBroe的線索!)很難察覺,因爲它沒有出現在我正在查看的任何瀏覽器輸出中(包括查看頁面源代碼)。

很久很久以前,我忘記了我已經設置了一個標準的表單處理函數來「清理」所有的POST數據。該函數中的一行取出每個發佈的值並將htmlspecialchars()函數應用於該函數。這將'b & b'轉換爲'b & b'。非常適合HTML echo'd輸出,不太適合數據庫比較字符串。

對於這個特定的應用,如果我不適用用htmlspecialchars()一切正常,無論是PDO的實現方式。

重新學習的課...不要忘記你建立的「默認值」!

1

由於在我上面的評論中提到,請使用適當的參數化語句。例如...

$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變量的設置位置和方式存在問題。後者通過我上面的答案解決。