function search_customer($search) { 
       global $db;
       $query = 'SELECT * FROM customers WHERE lastName LIKE :search';

       $statement = $db->prepare($query);
       $statement->bindValue(':search', $search);
       $statement->execute(); 
       $results = $statement->fetchAll();
       $statement->closeCursor();
       return $results;
}

Ce code me donne une table de clients avec le nom de famille que l'utilisateur place dans le champ de recherche. Mais cela ne fonctionne évidemment que lorsque vous mettez le nom de famille complet. Quelqu'un peut-il me dire comment je dois changer le code pour obtenir des résultats aussi si je n'entre par exemple que la première lettre du nom de famille?

1
user7784224 3 avril 2017 à 07:12

2 réponses

Meilleure réponse

Une solution MySQL

En fonction de la façon dont vous souhaitez que le match fonctionne, vous pouvez faire quelque chose comme ceci:

$query = 'SELECT * FROM customers
              WHERE lastName 
              LIKE CONCAT("%", :search, "%" )';

Cela renverrait des lignes où lastName avait: recherche comme sous-chaîne. CONCAT () est une fonction variadique qui combine tous ses arguments en une seule chaîne.

CONCAT("%", "John", "%") = "%John%"

Comment ça fonctionne

Pourquoi les pourcentages sont-ils utiles? LIKE de MySQL est un mot-clé de correspondance de modèle. LIKE a 2 caractères spéciaux "%" et "_" qui sont utilisés pour signifier "correspondre à n'importe quel groupe de 0 caractères ou plus" et "correspondre à n'importe quel caractère unique" respectivement.

Par exemple:

  • "% john%" correspondrait à "johnson", "john" ou "baker-johnson"
  • "joh_" correspondrait à "john", mais PAS à "joh"

Si vous vous souciez seulement de faire correspondre les lignes dont les noms commencent par une chaîne spécifique, vous supprimerez le premier "%". Cela aurait de meilleures performances et serait capable d'utiliser des index si vous les créez.

De plus, comme indiqué dans une autre réponse, cette concaténation pourrait être effectuée en PHP si vous le souhaitez. Cela présente l'avantage d'être plus polyvalent si vous souhaitez permettre à vos utilisateurs de sélectionner le type de correspondance à utiliser (par exemple, "Rechercher une chaîne entière" ou "Rechercher à partir du début de la chaîne")

Échappez à ces jokers!

Si vous utilisez une construction comme celle-ci, veillez à échapper les caractères génériques de LIKE ("%" et "_") à moins que vous ne souhaitiez que vos utilisateurs puissent utiliser eux-mêmes les caractères génériques. Si vous les laissez les utiliser, vous devez ajouter une clause LIMIT à votre déclaration, sinon vous courez le risque que quelqu'un entre "%" et renvoie chaque ligne de votre tableau.

Si vous voulez échapper à des choses, vous pouvez utiliser une méthode comme celle fournie dans cette réponse: https://stackoverflow.com/a/5020292

Vous pouvez facilement utiliser la str_replace () de PHP combiné avec la réponse liée à effectuez vos évasions. Par exemple:

function search_customer($search) { 
   global $db;
   $query = 'SELECT * FROM customers
                 WHERE lastName 
                 LIKE CONCAT("%", :search, "%" ) ESCAPE "|"';

   $escapedSearch = str_replace($search, ["%","_"], ["|%","|_"]);

   $statement = $db->prepare($query);
   $statement->bindValue(':search', $escapedSearch);
   $statement->execute(); 
   $results = $statement->fetchAll();
   $statement->closeCursor();
   return $results;
}
1
Community 23 mai 2017 à 12:32

Vous pouvez également mettre à jour votre fonction comme -

function SearchCustomer($search) { 
   global $db;
   $query = 'SELECT * FROM customers WHERE lastName LIKE :search';

   $statement = $db->prepare($query);
   $statement->bindValue(':search', '%'.$search.'%'); #Concatenate '%' sign with search String 
   $statement->execute(); 
   $results = $statement->fetchAll();
   $statement->closeCursor();
   return $results;
}

Remarque: Concaténer le signe % avec la chaîne de recherche, lors de la liaison de la valeur

OU

Utilisez MySQL CONCAT() pour mettre à jour votre requête

SELECT * FROM customers WHERE lastName LIKE CONCAT("%",:search,"%")

Voici les détails sur MySQL CONCAT

1
Sumon Sarker 3 avril 2017 à 08:56