1

次のクエリ(ここでは簡略化)を使用して、文字列に「ウォッチワード」が含まれているかどうかを確認しています。ウォッチワードはMySQLテーブルに含まれています。

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

これは単一の単語に対しては完全に機能しますが、フレーズに対しても機能するようにする必要があります(つまり、フィールドww_wordに複数の単語が含まれる場合があります)。私が考えることができるのは、テーブル全体を配列に読み込んでから、文字列内の単語の組み合わせと比較するために複数のループを実行するようなものですが、もっと良い方法があると確信しています。

編集:提案に感謝しますが、Mike Brantが指摘しているように、針はMySQLにあり、干し草の山はPHPにあります。たとえば、検索フォームのような「通常の」方法ではありません。文字列(実際にはメッセージ)に1つ以上の「ウォッチフレーズ」が含まれているかどうかを確認する必要があります。これは、不適切な言語のフィルターのようです(ただし、そうではありません)。

したがって、サンプルテーブル:

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 . "%'";

または多分2つを交換します

$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(文字列の一致ではなく)のようなものを使用するINと、MySQLは、MySQLテーブルにある干し草の山と(LIKE)のアプリケーションの針で正常に動作します。

MySQLに干し草の山を渡し、テーブル内のフィールドから針を適用するための便利な逆マッチングはありません。

データベースから針を選択し、アプリケーションの干し草の山と比較する必要があります。

于 2013-01-24T01:17:01.883 に答える