Comme déjà indiqué dans la question la requête
$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'
fonctionne pour les enregistrements correspondants où le SEARCHFIELD
contient un mot qui commence par (ou est égal à) $searchText
Concernant les performances j'ai fait un test sur ma machine de développement MBP 2,2 GHz i7 quad core
:
La recherche d'un mot sur 4 000 enregistrements prend environ 40 millisecondes.
Les enregistrements sont normalement indexés (pas de texte intégral).
J'ai quelques milliers d'enregistrements et la requête ne s'exécute pas très souvent, donc pour moi c'est bien.
La solution peut ne pas convenir à d'autres contextes.
Pour construire une instruction préparée avec la requête ci-dessus, j'ai utilisé la technique décrite ici :
Le code résultant est le suivant :
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 );
/* ... */