Wie bereits in der Frage erwähnt, die Abfrage
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
funktioniert für übereinstimmende Datensätze, bei denen SEARCHFIELD
enthält ein Wort, das mit $searchText
beginnt (oder gleich ist).
Bezüglich Performance habe ich einen Test auf meiner Entwicklungsmaschine MBP 2,2 GHz i7 quad core
gemacht :
Die Suche nach einem Wort in 4.000 Datensätzen dauert etwa 40 Millisekunden.
Datensätze werden normalerweise indiziert (kein Volltext).
Ich habe einige tausend Datensätze und die Abfrage wird nicht sehr oft ausgeführt, daher ist sie für mich gut.
Die Lösung ist möglicherweise nicht für andere Kontexte geeignet.
Um eine vorbereitete Anweisung mit der obigen Abfrage zu erstellen, habe ich die hier beschriebene Technik verwendet:
Der resultierende Code lautet wie folgt:
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 );
/* ... */