2013-01-24 18 views
1

我使用下面的查詢(簡化了這裏)檢查一個字符串包含了「看字」裏的手錶字包含在一個MySQL表短語:檢查字符串包括從數據庫

$sql = "SELECT ww_id FROM watch_words WHERE ww_word IN (" . $string . ")"; 

這適用於單個單詞,但現在我需要使它適用於短語(即字段ww_word可能包含多個單詞)。我能想到的只是將整個表格讀入一個數組,然後用多個循環與字符串中的單詞組合進行比較,但我確信(希望)有更好的方法。

編輯:感謝您的建議,但正如邁克布蘭特指出的,針是在MySQL和PHP中的乾草堆 - 而不是「通常」的方式(比如搜索表單)。我需要檢查一個字符串(實際上是一條消息)是否包含一個或多個「監視短語」 - 就像一個壞語言過濾器(但不是那樣)。

樣品臺這樣的:

CREATE TABLE `watch_words` (
    `ww_id` int(11) NOT NULL AUTO_INCREMENT, 
    `ww_word` varchar(250) NOT NULL, 
    PRIMARY KEY (`ww_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

INSERT INTO `watch_words` VALUES (1, 'foo bar'); 
INSERT INTO `watch_words` VALUES (2, 'nice sunny day'); 
INSERT INTO `watch_words` VALUES (3, 'whatever'); 
INSERT INTO `watch_words` VALUES (4, 'my full name here'); 
INSERT INTO `watch_words` VALUES (5, 'keyword'); 

所以字符串「我們現在有一個很好的陽光燦爛的日子」應該返回匹配,而「多可愛的陽光燦爛的日子......」不會。 TIA。

回答

1

你可能需要在這裏採取不同的方法。你有MySQL中的指針和PHP中的乾草堆。使用諸如LIKE(您用於字符串匹配而不是IN)之類的東西,MySQL可以在乾草堆在MySQL表中和應用程序中的針頭(在LIKE中)正常工作。

沒有方便的反向匹配來通過MySQL haystack並讓它在表中的一個字段上應用針來對抗它。

您可能需要從數據庫中選擇針,並將其與應用程序中的草垛進行比較。

3

使用LIKE模式匹配

$sql = "SELECT ww_id FROM watch_words WHERE ww_word LIKE '%" . $string . "%'"; 

或也許交換兩個,

$sql = "SELECT ww_id FROM watch_words WHERE " . $string . " LIKE CONCAT('%', ww_word,'%')"; 

作爲旁註,查詢是脆弱與SQL Injection如果值(小號)從來到外。請看下面的文章,瞭解如何防止它。通過使用PreparedStatements你可以擺脫使用單引號圍繞值。

+0

另外值得注意的是,在LIKE中以通配符($ _)開頭會阻止使用索引,因此這可能會影響大型表上的性能。 – twoleggedhorse

+0

我也建議調查MATCH AGAINST。如果你有多個LIKE字樣,你需要做一些類似'ww_word' LIKE'%「。$ word1。」%'或'ww_word' LIKE'%「。$ word2。」%'等 –

+0

謝謝,我會測試。我認爲這隻會反過來工作(即如果數據庫包含字符串和短語搜索)。我正在搜索消息,看看它們是否包含某些短語(比如一個不好的警告類的事情,但不是這樣)。 – da5id

相關問題