1

コードに次の SQL クエリがあります。

SELECT ANSWER FROM FAQ WHERE (ANSWER LIKE '%".$searchKey."%')

ANSWER には html および style タグも含まれている可能性があり、上記のクエリはプレーンテキストが一致しても何も取得しません。私はSymfony 1.1を使用しており、上記のクエリはfaq.phpファイルにあります。

では、この問題をどのように克服できるかを誰かが提案できますか?

4

4 に答える 4

0

私は最初に言った:

"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);
}
于 2012-07-24T10:51:50.790 に答える
0

あなたがする必要があるのは、PHP関数を使用することhtmlentities(answer)です。HTMLタグはプレーンテキストとして表示されます。

それが役に立てば幸い、

ブラム

于 2012-07-24T13:22:47.923 に答える
0

これが古いことは知っていますが、次の関数を作成することで問題を解決できると思います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."%')
于 2013-04-18T11:28:30.190 に答える
0

そのような機能は既製品にはありません。それを書くこともできますが、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」の両方に一致するものを検索できます。これには誤検知が伴いますが、削除された補助的な列やテーブルに頼ることなく、現在のデータベースを使用できます。

于 2012-07-24T13:32:12.237 に答える