2011-11-26 225 views
0

我有一種情況,我的通配符搜索是不是真的如何我認爲它應該... 這是我正在運行的MySQL查詢,它將只返回整個單詞...通配符搜索w/MySQL

例如。如果我輸入「手機」作爲搜索詞將返回在它與「手機」中的所有行,但不排,「手機」(注意加「S」)

mysql_query(" SELECT * FROM posts WHERE permalink = '$permalink' AND LOWER(raw_text) LIKE '%$str%' "); 

我怎樣才能得到它返回搜索詞的所有變體?很明顯,我知道這可能會遇到問題,因爲如果用戶輸入常見的字母,它可能會返回各種匹配,我認爲我可以使這部分高級搜索選項。

ADENDUM 我已經把範圍縮小到不帶通配符的問題,但有什麼我用返回的數據做......這是我的正則表達式,我在數據投擲。

$pattern= "/(?:[\w\"',.-]+\s*){0,5}[\"',.-]?\S*".$str."(\s|[,.!?])(\s*[A-Za-z0-9.,-]+){0,5}/"; 

preg_match_all($pattern, $row["raw_text"], $matches); 

該正則表達式在原始數據中找不到字符串,因此我正在返回空值。一個新問題,我並不熟悉正則表達式,所以我將盡可能地將這個問題解決出來......也許我會很快拋出一個新問題!

感謝, 中號

+0

這並不直接回答你的問題,但它可能解釋你會看到它的一些奇怪的行爲。 [使用mysqli_prepare()]準備的查詢(http://php.net/manual/en/mysqli.prepare.php)。這個代碼就像它一樣,寫有「SQL注入漏洞」。 –

回答

1

我想別的東西是怎麼回事。查詢的%部分似乎是正確的。而這似乎是確認:

select 'phones' LIKE '%phone%'; 
+-------------------------+ 
| 'phones' LIKE '%phone%' | 
+-------------------------+ 
|      1 | 
+-------------------------+ 
1 row in set (0.00 sec) 

順便說一句,我真的希望你在$str做了嚴格的衛生(和$permalink太多,如果它是來自用戶的輸入)。您應該只允許使用字母數字和少量其他安全字符(可能爲空格),並且在mysql_query()中使用它之前,您應該通過mysql_real_escape_string()運行它。更好的是,看看PDO

無論如何,回到故障排除這一點:有一件事要嘗試可能是讓程序記錄發送到mysql_query()的字符串。基本上,將調用mysql_query()改爲致電error_log()echo()或類似的東西。然後將結果查詢複製並粘貼到MySQL命令行工具或PHPmyAdmin中或其他任何地方。當這個查詢不能按照你期望的方式工作時,至少你可以查看它並調整它來找出結果。誰知道呢,也許一旦你看到查詢拼寫出來,它就會非常明顯。

+0

我同意......雖然......我似乎無法將我的頭包裹起來......但我知道,在我的測試數據中,我有包含「槍」和「槍」等單詞和變體的記錄。但是,當我搜索「槍」時,它只會返回包含「槍」的記錄,而不是「槍」的記錄......嗯...... 就衛生而言,永久鏈接是由我創建的功能生成的,它去除了所有不友好的字符並創建友好的永久鏈接。至於搜索,到目前爲止,它只是採取原始輸入,但我最終將清理搜索字符串,只允許某些字符。 –

+0

有一件事要嘗試可能是讓程序記錄發送給'mysql_query()'的字符串。基本上,將調用改爲'mysql_query()'調用'error_log()'或'echo()'或類似的東西。然後將結果查詢複製並粘貼到MySQL命令行工具或PHPmyAdmin中或其他任何地方。當這個查詢不能按照你期望的方式工作時,至少你可以查看它並調整它來找出結果。誰知道呢,也許一旦你看到查詢拼寫出來,它就會非常明顯。 – Trott

+0

這正是我在附錄中思考的問題...查詢正確地返回了數據,這是我用我的正則表達式處理數據後的字...我現在用一個正確的正則表達式修復它,現在它工作得很漂亮!雖然感謝您的答案! –

0

我懷疑你有你的$str變量尾隨的空間,這可以解釋你所看到的:你LIKE標準將'%phone %',它匹配"... phone ...",但不"... phones ..."

先試着調整你的值。

+0

這正是我的附錄中的想法...查詢正確地返回數據,這是我用我的正則表達式處理數據後的字...我現在用一個正確的正則表達式修復它,現在它工作得很漂亮!雖然感謝您的答案! –