2017-08-21 109 views
-3

我有一個PHP搜索頁面,它使用以下查詢從數據庫中獲取內容。PHP SQL搜索查詢匹配

SELECT * FROM linkBase WHERE (`title` LIKE '%".$s."%') OR (`descr` LIKE '%".$s."%') 

這裏是我的數據庫看起來像:

id |title   |descr 
----------------------------------------- 
1 |Hello World |This is a hello world description 
2 |PiedPiper  |The silicon valley company PiedPiper 
3 |StackOverflow |Ask questions on programming 

現在,例如,如果我運行此查詢與$s = "silicon valley"值,然後取了row 2。這可以。但是如果用戶輸入搜索詞作爲silicon PiedPiper會怎麼樣。它不返回上述SQL查詢的結果。我該如何修改查詢,使其返回row 2以及第二個搜索詞。

問題夏日: 我該怎麼辦,如果用戶輸入未在DB放置隨之彼此兩個詞使用PHP和SQL這樣一個結果將是,即使返回的搜索查詢

+0

[MySQL](https://dev.mysql.com/doc/refman/5.7/en/)和[SQL Server](https://docs.microsoft.com/en-us/sql/t- sql/language-reference)是由不同公司生產的不同軟件包。即使兩者都實現SQL,它們也會以不同的方式擴展它們,有時它們會使用不同的語法約定來使查詢在它們之間不兼容。請僅使用與您使用的軟件相匹配的標籤。 – axiac

+1

用'%'登錄'$ s'替換空格... –

+0

請注意使用此代碼執行sql注入。嘗試使用參數化查詢。 – MrApnea

回答

0

LIKE '%{ 「$ S」}%' 或者是老學校INSTR(title, '{'。$ S。 '}')> 0

1

如果您需要支持任意我建議使用REGEXP MySQL函數,使用簡單的「或」正則表達式,如

SELECT * FROM linkBase WHERE (`title` REGEXP 'silicon|PiedPiper') OR (`descr` REGEXP 'silicon|PiedPiper') 

所以你可以用PHP代替空白並用管道符號(|)替換它們,並且單詞的順序不再重要。

這將選擇至少包含一個單詞的所有行,如果需要匹配列表中的所有單詞,則可能需要另一個正則表達式。