2013-01-24 15 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

相关问题