質問ですでに述べたように、クエリ
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
SEARCHFIELD
が一致するレコードに対して機能します $searchText
で始まる(または等しい)単語が含まれています
パフォーマンスに関しては、開発マシンでテストを行いましたMBP 2,2 GHz i7 quad core
:
4.000レコードで単語を検索するには、約40ミリ秒かかります。
通常、レコードにはインデックスが付けられます(フルテキストはありません)。
私は数千のレコードを持っていて、クエリはあまり実行されないので、私にとっては良いことです。
このソリューションは、他のコンテキストには適していない可能性があります。
上記のクエリでプリペアドステートメントを作成するために、ここで説明する手法を使用しました:
結果のコードは次のとおりです。
function like($s, $e)
{
return str_replace(array($e, '_', '%'), array($e . $e, $e . '_', $e . '%'), $s);
}
/* ... */
/* create a prepared statement */
$stmt = $mysqli->prepare(
'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE ? ESCAPE "=" OR SEARCHFIELD LIKE ? ESCAPE "="'
);
if( $stmt )
{
/* escape the text */
$escSearchText = like( $searchText, "=" );
/* 'like' parameters */
$like1 = $escSearchText . "%";
$like2 = "%" . $escSearchText . "%";
/* bind parameters for markers */
$stmt->bind_param( "ss", $like1, $like2 );
/* ... */