2014-10-09 38 views
-3

我有一個搜索MySQL表的PHP腳本。它適用於常規文本搜索,但在搜索字符串包含單引號(如單詞O'Brien)時不返回結果。在phpMyAdmin中運行等效的SQL確實會返回結果。PHP:當搜索參數包含單引號時,MYSQLi查詢不返回任何結果

這裏是代碼我使用:

$mysqli = new mysqli($host, $user, $password, $database); 
$mysqli->set_charset('utf8');  

if (isset($_GET["q"])) 
{ 
    $search = $_GET["q"]; 
} 

$sql = 'SELECT * FROM MyTable WHERE MyField LIKE ?'; 
$stmt = $mysqli->prepare($sql); 
$param = '%' . $search . '%'; 
$stmt->bind_param("s", $param); 
$stmt->execute(); 
$result = $stmt->get_result(); 

如何處理像O'Brien使這個返回結果字符串?

+0

您是否已驗證'$ search'的值?如果你在一個非常舊的服務器上,理論上可以啓用魔術引號...... – jeroen 2014-10-09 22:10:17

+0

同樣對於數據庫中的確切值,它們是否與你期望的完全相同? – jeroen 2014-10-09 22:19:14

回答

0

使用mysqli::real_escape_string();

$sql = $mysqli->real_escape_string($sql); // where $mysqli is your connection 

希望這會有所幫助。

+1

當您使用預準備語句時,這不是必需的,它實際上會將斜槓添加到您的變量中,而數據庫中可能沒有該變量。 – jeroen 2014-10-09 22:09:43

+0

@jeroen它不應該是準備好的陳述的問題,但顯然是。考慮到這一點,我懷疑OP已經打開了魔術引號,但如果他們無法改變(很可能),那麼這是一個可以接受的解決方法。 – worldofjr 2014-10-09 22:14:25

+1

不,這是相反的方式,如果啓用了魔術引號,則輸入已經有引號,並且需要將其剝離以匹配數據庫,引號不會用反斜槓轉義... – jeroen 2014-10-09 22:18:25

1

好了,它看起來像問題是,使用filter_var一些舊代碼:

filter_var($search, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW); 

當我刪除此,查詢工作正常。

謝謝你的時間!

Paul

+0

要澄清,此將意味着sanitize過濾器正在改變輸入數據,並且查詢無法匹配數據庫中已更改的字符串,因爲沒有條目匹配它。 *不是因爲任何與SQL注入遠程相關的東西,因爲不管您是否正確使用準備好的語句,每個人似乎都已鎖定。如果您在原始問題中包含上述代碼,則問題至少可以被我們看到。 – Sammitch 2014-10-09 23:33:43

+0

誰在提及SQL注入? – worldofjr 2014-10-09 23:34:41

+0

@worldofjr @worldofjr將SQL注入中包含的SQL引擎不正確的引號等同於SQL注入,這意味着你和其他人已經刪除了他的答案。 – Sammitch 2014-10-09 23:36:47

相關問題