Soit ce que le C Man conseillé (diviser la phrase de recherche et rechercher tous les mots), ou la recherche de texte intégral.
Pour la méthode "mots de division", je conseille de:
- utiliser des expressions régulières pour le fractionnement, quelque chose comme
preg_match_all('#[a-zA-Z0-9]+#', $text, $words)
;
vous n'avez pas besoin de rechercher des symboles comme "$", et vous?
- écrivez une fonction qui générerait la clause
where
pour vous.
Fonction pour générer where
clause pourrait ressembler à ceci:
function generateFilter(array $fields, array $words) {
// prepare $word for putting into SQL statement
foreach ($words as &$word) {
// ensure that wildcard characters are used as regular characters
$word = str_replace('%', '\\%', $word);
$word = str_replace('_', '\\_', $word);
// prevent SQL injections
$word = mysql_real_escape_string($word);
}
unset($word);
// generate filter
$filter = array();
foreach ($words as $word) {
$wordFilter = array();
foreach ($fields as $field) {
$wordFilter[] = "{$field} like '%$word%'";
}
$filter[] = implode(' or ', $wordFilter);
}
$filter = '(' . implode(') and (', $filter) . ')';
return $filter;
}
$filter = generateFilter(
array('name', 'surname', 'address'),
array('john', 'doe')
);
echo $filter;
Résultat:
(name like '%john%' or surname like '%john%' or address like '%john%') and
(name like '%doe%' or surname like '%doe%' or address like '%doe%')
Si vous utilisez des instructions préparées (qui est fortement conseillé), cette fonction serait un peu plus compliqué, car la chaîne résultante aurait des espaces réservés pour les variables, tandis que $ mots seraient placés dans un tableau de variables qui doivent être liées à l'instruction préparée.
La méthode "Séparer les mots" fonctionne pour les petites chaînes et les petites quantités de données. Si vous avez d'énormes quantités de données et/ou de grandes chaînes, pensez à utiliser la recherche fulltext. Il n'a pas besoin de diviser la phrase de recherche, mais il a quelques limitations - il a besoin d'un index fulltext sur les colonnes utilisées pour la recherche (IIRC, vous pouvez créer un index sur plusieurs colonnes et utiliser la recherche fulltext sur toutes les colonnes indexées en même temps, c'est-à-dire que vous n'avez pas besoin de rechercher toutes les colonnes), il a une longueur minimale de mots-clés et peut donner des résultats non-stricts, par exemple, seulement 3 des 5 mots-clés peuvent apparaître dans le résultat. Cependant, il donne la pertinence de chaque résultat - les résultats qui sont plus proches des termes de recherche auront une plus grande pertinence. Ceci est utile pour trier les résultats par pertinence.
Bien que la création d'index puisse sembler être un «travail supplémentaire» pour vous, cela permettra au SGBD d'effectuer la recherche plus rapidement que sans index.
utilisateur - Pouvez-vous décrire mieux cela? Il semble que 'pname' est un champ de la table' english' mais qu'est-ce que c'est avec les variables PHP? '$ val',' $ search', '$ key_value' ?? –
Ils sont la valeur des formes ... Merci j'ai implémenté la requête Gaurav et son fonctionnement. – user734024