检查字符串是否包含数据库中的短语


Check if string includes phrases from database

我使用以下查询(此处简化)来检查字符串是否包含"监视词",其中监视词包含在MySQL表中:

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

这非常适合单个单词,但现在我需要让它适用于短语(即字段ww_word可能包含多个单词)。我能想到的只是将整个表读入数组,然后执行多个循环以与字符串中单词的组合进行比较,但我确信(希望)有更好的方法。

编辑:感谢您的建议,但正如Mike Brant指出的那样,指针在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');

所以字符串"我们有一个多么美好的阳光明媚的日子"应该返回一场比赛,而"多么可爱的阳光明媚的日子......"不会。蒂亚。

使用 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您可以摆脱在值周围使用单引号。

  • 如何防止 PHP 中的 SQL 注入

您可能需要在此处采取不同的方法。 你有MySQL中的针和PHP中的大海捞针。使用像LIKE这样的东西(你用于字符串匹配而不是IN),MySQL可以很好地处理MySQL表中的干草堆和应用程序中的针(在LIKE中)。

没有方便的反向匹配来传递 MySQL 干草堆并让它从表中的字段中对它施加一根针。

您可能需要从数据库中选择您的针头,并将其与应用程序中的大海捞针进行比较。