1

次のクエリを使用して、phpで検索フォームを作成しようとしています:

$this->images('`description`="'.db::escape($mysearch).'"');

うまく機能していますが、$mysearchに対応する正確な説明のみが返されます。$ mysearchフィールドからキーワード(1、2、または3)を含むすべての説明を返すようにしたいと思います。正確なSQLクエリは何ですか?私はで試しました:

'MATCH `description` AGAINST "'.db::escape($mysearch).'"'

しかし、エラーが返されます。

SQL構文にエラーがあります。title1行目の「MATCHAGAINST"mykeyword"」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

解決策は:

'MATCH(title) AGAINST ("'.db::escape($keyword).'" IN BOOLEAN MODE)'
4

1 に答える 1

2

区切り文字としてスペースまたはコンマでexplode:http: //php.net/manual/en/function.explode.phpを使用 し、結果の配列でそれぞれに対してaを実行して、次の各文字列のクエリに行を追加します。その配列。

疑似例の場合:

//input of the string
$input = "keyword1 keyword2 keyword3";
$inputArray = explode(" ",$input);
foreach ($inputArray as $keyword) {
  $sql .= " OR tableName.ColName like '%$keyword%'";
}

明らかにそれをクリーンアップして入力を検証し、プリペアドステートメントなどを使用することをお勧めします(ある種のORMを使用しているように見えますか?)、そしてうまくいけば、説明列は比較的短く、完全なコンテンツにインデックスがあります。スロー。

更新:フルテキストインデックスを使用する構文を試みていたと思います。MyISAMテーブル、またはInnoDBテーブルのフルテキストインデックスをサポートする十分に新しいバージョンのmysqlがある場合は、テーブルに収まるよりも多くのレコードがあると非常に遅くなるため、私が提供したこのソリューションをスキップすることをお勧めしますメモリ/キャッシュに。残念ながら、私は全文索引を使用したことがなく、そこであなたを助けることはできません。上記のソリューションと比較して、Zend_Search_Luceneの使用に切り替えています。(http://framework.zend.com/manual/en/zend.search.lucene.html)

于 2012-04-25T17:39:44.360 に答える