[PHP] MySQL - chercher présence sous chaine dans une cellule avec LIKE

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

[PHP] MySQL - chercher présence sous chaine dans une cellule avec LIKE

Message par voxdemonix » sam. févr. 18, 2017 1:02 pm

Chercher présence d'une sous chaîne dans une chaîne avec MySQL grâce à LIKE
Admettons que nous possédions une table "articles" contenant une cellule "quelleCategorie". Dans cette cellule nous indiquons une ou plusieurs catégories pour chaque articles comme dans l'exemple suivant :
  • id | nomArticle | quelleCategorie | dateCreation
    1 | banane | fruits | 5
    2 | jus d'orange | jus de fruits | 9
    3 | tomate | fruits ; legumes | 22
    4 | maison | immobilier | 42
Admettons que nous désirons récupérer tout les articles ayant "fruit" dans "quelleCategorie". Avec l'option LIKE nous allons pouvoir spécifier une expression régulière afin de récupérer banane, jus d'orange et tomate et ce même si chacun possède une version légèrement différente de la catégorie.
À noter que vous pouvez aussi utiliser NOT LIKE qui vous permet de faire exactement l'inverse : demander à MySQL de ne retourner que les chaînes où n'est PAS présent le pattern.

L'exemple suivant va sélectionner dans la table "articles" tout les éléments ayant dans leur cellule "quelleCategorie" la sous-chaîne contenue dans la variable $categorieChoisie, classés du plus récent aux plus anciens.
  • Code : Tout sélectionner

    <?php
    $bdd_hostname = "localhost";
    $bdd_name = "nomDeMaBase";
    $bdd_login = "loginDeMaBase";
    $bdd_password = "passowrdDeMaBase";
    try {
    	$bdd = new PDO('mysql:host='.$bdd_hostname.';dbname='.$bdd_name.';charset=utf8', $bdd_login, $bdd_password);
    } catch( Exception $e){
    	error_log("Error BDD connexion from ".$_SERVER["PHP_SELF"]);
    }
    
    $categorieChoisie = "fruit";
    
    $requestSQL = $bdd->prepare('SELECT `*` FROM articles WHERE `quelleCategorie` LIKE %{:categorieChoisie}%  ORDER BY `dateCreation`');
    $requestSQL->bindParam(':categorieChoisie', strval($categorieChoisie), PDO::PARAM_STR);
    $requestSQL->execute();
    $myArticles = $requestSomeArticles->fetchAll(PDO::FETCH_CLASS);
    print_r($myArticles);
    ?>
Explication en détails :
  1. On tente de connecter PDO à la base de données, si on réussi on obtient l'objet $bdd si non on retourne une erreur dans les logs (/var/log/apache2/error.log)
    • Code : Tout sélectionner

      try {
      	$bdd = new PDO('mysql:host='.$bdd_hostname.';dbname='.$bdd_name.';charset=utf8', $bdd_login, $bdd_password);
      } catch( Exception $e){
      	error_log("Error BDD connexion from ".$_SERVER["PHP_SELF"]);
      }
  2. On défini notre sous chaîne à rechercher : fruit
  3. On demande a PDO de préparer notre requête à partir de l'objet $bdd
    • Code : Tout sélectionner

      $requestSQL = $bdd->prepare('SELECT `*` FROM articles WHERE `quelleCategorie` LIKE %{:categorieChoisie}%  ORDER BY `dateCreation`');
      Ici on lui demande de tout (*) récupérer dans "articles" où "quelleCategorie" ressemble à la chaîne injectée, ordonnée (ORDER BY) par leur date de création.
  4. On injecte le paramètre de recherche (fruit)
    • Code : Tout sélectionner

      $requestSQL->bindParam(':categorieChoisie', strval($categorieChoisie), PDO::PARAM_STR);
  5. On exécute la requête
  6. On récupère le résultat de la requête SQL sous forme d'objet
    • Code : Tout sélectionner

      $myArticles = $requestSomeArticles->fetchAll(PDO::FETCH_CLASS); 
  7. Si vous préférez récupérer sous forme de tableau, remplacez la précédente ligne par les suivantes
    • Code : Tout sélectionner

      $myArticles = array();
      while($tmpArticle = $requestSomeArticles->fetch(PDO::FETCH_ASSOC)){
      	$myArticles[] = $tmpArticle;
      }
  8. On affiche le résultat
Farm Link
Modifié en dernier par voxdemonix le sam. févr. 25, 2017 5:30 pm, modifié 3 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

Re: [PHP] MySQL - chercher présence sous chaine dans une cellule avec LIKE

Message par voxdemonix » sam. févr. 25, 2017 1:43 pm

Note pour la rédaction :
Se serait pas mal de faire un exemple groupé avec le tuto sur l'ajax en PHP
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Qui est en ligne

Utilisateurs parcourant ce forum : CommonCrawl [Bot] et 0 invité