Zoals reeds vermeld in de vraag de vraag
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
werkt voor het matchen van records waarbij het SEARCHFIELD
bevat een woord dat begint met (of gelijk is aan) $searchText
Wat betreft prestaties heb ik een test gedaan op mijn ontwikkelmachine MBP 2,2 GHz i7 quad core
:
Zoeken naar een woord op 4.000 records duurt ongeveer 40 milliseconden.
Records worden normaal gesproken geïndexeerd (geen fulltext).
Ik heb een paar duizenden records en de query wordt niet vaak uitgevoerd, dus voor mij is het goed.
De oplossing is mogelijk niet geschikt voor andere contexten.
Om een voorbereid statement op te bouwen met de bovenstaande query heb ik de hier beschreven techniek gebruikt:
De resulterende code is als volgt:
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 );
/* ... */