2016-07-07 429 views
0

在laravel中,我有一個用戶可以輸入的搜索框來搜索數據庫。Laravel/PDO不能轉義反斜槓或引號?

它在提交時執行以下代碼(在此只顯示重要部分)。

$searchBox = $request->get('searchBox'); 

... 
$getSearch->where(function($query) use($searchBox) { 
    $query->orWhere('event', 'LIKE', '%'.$searchBox.'%'); 
    $query->orWhere('sub_event', 'LIKE', '%'.$searchBox.'%'); 
}); 

的問題是,如果使用輸入雙引號(「)或反斜槓()查詢失敗。它似乎沒有要逃避這些字符。

如果我這樣做。

$searchBox = addslashes($searchBox); 

然後它的偉大工程。

我不知道這是否是一個laravel或PDO的問題(或者不是一個問題,在所有)。我需要進行消毒的反斜槓所有的用戶輸入?我應該使用addsl骨灰?還是我不明白這應該如何工作。

當搜索條件包含反斜槓或雙引號時,如何在mysql/PDO/laravel中執行LIKE搜索?

感謝

*編輯

我應該檢查什麼,我實際上得到的錯誤了。我現在已經做到了。

我認爲這是一個奇怪的錯誤,因爲它是當我運行查詢時給我的網頁重定向循環。但下面的@David Smith的評論讓我重新檢查了這一點。原來,這是導致循環的查詢的一個零結果。

非常抱歉,我應該從一開始就更加清楚。查詢實際上並不「失敗」,我只是沒有結果。

但我需要人們能夠搜索評論/字段,可能(並且)有反斜槓和雙引號。

事實上,修復循環似乎現在雙引號工作。它的反斜槓導致了零結果。如果我搜索帶有反斜槓的短語,則不會得到任何結果。

我不認爲這是因爲查詢將反斜槓視爲轉義字符而不是反斜槓來搜索。

如果這是正確的,那麼我該如何讓我的用戶搜索包含反斜槓的條款? addslashes仍然是要走的路?

+0

Laravel不需要逃避數據,因爲它使用的參數查詢。我的猜測是數據庫中的數據實際上包含斜線,而不應該使用斜線。 – patricus

+0

你說「查詢失敗」。這到底是什麼意思? MySQL返回錯誤,還是查詢返回零結果? –

+0

@DavidSmith你帶來了一個好點,我編輯澄清。失敗意味着這裏的結果爲零。 – Nertskull

回答

1

A backslash is a special character for LIKE,因此必須僅爲該操作員轉義。

所以,如果你確實必須做出一個反斜槓仔細匹配,那麼處理您的數據在LIKE語句中使用此代碼

$data = addCslashes($data, '\\'); 
+0

所以我應該總是使用LIKE運算符的搜索字段使用addcslashes?這不會影響PDO查詢正常進行的轉義? – Nertskull

+0

是的,看起來像你必須使用它。不,它不應該干涉。 –