1

我正在使用以下查询(此处为简化)来检查字符串是否包含“守望词”,其中守望词包含在 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');

所以字符串“我们有多么美好的晴天”应该返回匹配,而“多么可爱的晴天......”不会。TIA。

4

2 回答 2

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如果值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

于 2013-01-24T01:14:15.170 回答
1

您可能需要在这里采取不同的方法。MySQL 中有针,PHP 中有大海捞针。使用诸如LIKE(用于字符串匹配 not IN)之类的东西,MySQL 可以在 MySQL 表中的 haystack 和应用程序中的 needle (在LIKE)中正常工作。

没有方便的反向匹配来传递 MySQL 大海捞针并让它从表中的字段中对其应用针。

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

于 2013-01-24T01:17:01.883 回答