我使用以下查询(此处简化)来检查字符串是否包含监视字包含在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。
答案 0 :(得分: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,'%')";
作为旁注,如果值( s )来自外部,则查询易受SQL Injection
攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements
,您可以摆脱在值周围使用单引号。
答案 1 :(得分:1)
您可能需要采取不同的方法。你有MySQL的针和PHP中的haystack。使用诸如LIKE
(用于字符串匹配而非IN
)之类的东西,MySQL可以正常使用MySQL表中的haystack和应用程序中的指针(在LIKE
中)。
没有方便的反向匹配来传递MySQL干草堆并让它从表中的字段应用针对它。
您可能需要从数据库中选择针头并将其与应用程序中的草垛进行比较。