コードに次の SQL クエリがあります。
SELECT ANSWER FROM FAQ WHERE (ANSWER LIKE '%".$searchKey."%')
ANSWER には html および style タグも含まれている可能性があり、上記のクエリはプレーンテキストが一致しても何も取得しません。私はSymfony 1.1を使用しており、上記のクエリはfaq.php
ファイルにあります。
では、この問題をどのように克服できるかを誰かが提案できますか?
私は最初に言った:
"SELECT `answer` FROM `faq` WHERE (`answer` LIKE '%".strip_tags($searchKey)."%'")
しかし、これはコメントのために追加されたものです..
なぜこのようなことをしないのですか?
$query = mysql_query("SELECT `answer` FROM `faq` WHERE (`answer` LIKE '%$searchKey%'");
while ($result = mysql_fetch_object($query)) {
$newStrippedItem = strip_tags($result->columnItemName);
}
あなたがする必要があるのは、PHP
関数を使用することhtmlentities(answer)
です。HTML
タグはプレーンテキストとして表示されます。
それが役に立てば幸い、
ブラム
これが古いことは知っていますが、次の関数を作成することで問題を解決できると思いますmysql
:
DELIMITER |
DROP FUNCTION IF EXISTS plain_text |
CREATE FUNCTION plain_text( Dirty text )
RETURNS text
DETERMINISTIC
BEGIN
DECLARE iStart, iEnd, iLength int;
WHILE Locate( '<', Dirty ) > 0 And Locate( '>', Dirty, Locate( '<', Dirty )) > 0 DO
BEGIN
SET iStart = Locate( '<style>', Dirty ), iEnd = Locate( '</style>', Dirty);
IF iEnd > 0 THEN
BEGIN
SET iLength = ( iEnd - iStart) + 12;
END;
ELSE
BEGIN
SET iStart = Locate( '<', Dirty ), iEnd = Locate( '>', Dirty, Locate('<', Dirty ));
SET iLength = ( iEnd - iStart) + 1;
END;
END IF;
IF iLength > 0 THEN
BEGIN
SET Dirty = Insert( Dirty, iStart, iLength, '');
END;
END IF;
END;
END WHILE;
RETURN Dirty;
END;
|
DELIMITER ;
この関数は、すべての html タグとタグ間のすべてを削除し<style></style>
ます。
次に、次のようにクエリを実行できます。
SELECT plain_text(ANSWER) as plain_t FROM FAQ HAVING (plain_t LIKE '%".$searchKey."%')
そのような機能は既製品にはありません。それを書くこともできますが、ANSWER の「簡略化された」バージョンを準備し、そのバージョンでフルテキスト マッチングを実行する方がはるかに効率的です。結局、検索は、ANSWER の strip_tag されたバージョンで行われます: それが mysql_strip_tag 関数によって生成されるか、ANSWER_SIMPLE 列に格納されるかに関係なく、ロジックは同じです。
検索では、たとえば、タグを削除し、ノイズ ワードを削除し、SearchQuery を小文字にしてから、ANSWER_SIMPLE 内で SimplifiedSearchQuery を探します。また、格納する前にすべての単語を Soundex 形式に変換し、(オプションで?) 「類似点」を検索するなど、他のトリックを実行することもできます。
もう 1 つの可能性は、SearchQuery を単一の単語にチャンクし、それらを個別に検索することです。したがって、「しかし、{em}私{/em} はあなたの {em}Queen{/em} です!」という理由で HTML 化された回答が一致しない場合、SearchQuery の「your Queen」が見つからない場合、「your」と「Queen」の両方に一致するものを検索できます。これには誤検知が伴いますが、削除された補助的な列やテーブルに頼ることなく、現在のデータベースを使用できます。