IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

POO - Créer méthode pour une recherche multi-critères


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut POO - Créer méthode pour une recherche multi-critères
    Bonjour,

    Grâce aux 2 classes suivantes, j'affiche une liste de livres :

    -> ListeLivres.class.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    <?php
    class Livre
    {
      private $_titre;
      private $_isbn;
      private $_librairie;
      private $_genre;
     
     
      // Un tableau de données doit être passé à la fonction (d'où le préfixe « array »).
    public function hydrate(array $donnees)
    {
      foreach ($donnees as $key => $value)
      {
        // On récupère le nom du setter correspondant à l'attribut.
        $method = 'set'.ucfirst($key);
     
        // Si le setter correspondant existe.
        if (method_exists($this, $method))
        {
          // On appelle le setter.
          $this->$method($value);
        }
      }
    }
     
    public function __construct(array $donnees){
    	$this->hydrate($donnees);
    }
     
      public function titre() { return $this->_titre; }
      public function isbn() { return $this->_isbn; }
      public function librairie() { return $this->_librairie; }
      public function genre() { return $this->_genre; }
     
      public function setTitre($titre)
      {
        // On vérifie qu'il s'agit bien d'une chaîne de caractères.
        if (is_string($titre) )
        {
          $this->_titre = $titre;
        }
      }
     
      public function setLibrairie($librairie)
      {
        // On vérifie qu'il s'agit bien d'une chaîne de caractères.
        if (is_string($librairie) )
        {
          $this->_librairie = $librairie;
        }
      }  
     
      public function setGenre($genre)
      {
        // On vérifie qu'il s'agit bien d'une chaîne de caractères.
        if (is_string($genre) )
        {
          $this->_genre = $genre;
        }
      }   
     
      public function setIsbn($isbn)
      {
        // On vérifie qu'il s'agit bien d'un entier.
        if (intval($isbn) )
        {
          $this->_isbn = $isbn;
        }
      }  
     
    }
    -> ManagerLivres.class.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <?php
     
    class Manager
    {
    	  private $_db; // Instance de PDO
     
    	  public function __construct($db)
    	  {
    		$this->setDb($db);
     
    	  }
     
    		public function getList()
    		{
    		$liste = array();
     
    		$q = $this->_db->query('SELECT L.TITRE AS titre,L.ISBN AS isbn,L.SOUS_TITRE AS sous_titre,LEFT(L.TITRE,50)AS extrait_titre, L.ID_LIVRE AS id_livre,
    L.DATE_ACHAT AS date_achat,L.DATE_PUBLICATION AS date_publication,L.DATE_LECTURE AS date_lecture,  L.fichier_couverture_recto AS couverture_recto, L.miniature,  
    ED.NOM_EDITEUR AS editeur,ED.ID_EDITEUR AS id_editeur,LIB.NOM_LIBRAIRIE AS librairie,LIB.ID_LIBRAIRIE AS id_librairie,FORM.NOM_FORMAT AS format,FORM.ID_FORMAT AS id_format, L.COMMENTAIRES AS commentaires,
    L.RESUME AS resume,LEFT(L.RESUME,215)AS extrait, L.STATUT_LECTURE AS statut_lecture, L.APPRECIATION AS appreciation, L.NB_PAGES AS nb_pages,G.NOM_GENRE as genre, G.ID_GENRE
    
     
    FROM LIVRE L
    INNER JOIN EDITEUR ED		
    ON ED.ID_EDITEUR = L.ID_EDITEUR	
    
    INNER JOIN LIBRAIRIE LIB		
    ON LIB.ID_LIBRAIRIE = L.ID_LIBRAIRIE
    
    INNER JOIN FORMAT FORM		
    ON FORM.ID_FORMAT = L.ID_FORMAT
    
    INNER JOIN THEMATISE T ON T.ID_LIVRE = L.ID_LIVRE
    INNER JOIN GENRE G ON T.ID_GENRE = G.ID_GENRE
    
    ');
     
    		while ($donnees = $q->fetch(PDO::FETCH_ASSOC))
    		{
    		  $liste[] = new Livre($donnees);
    		}
     
    		return $liste;
    		}
     
      public function setDb(PDO $db)
      {
        $this->_db = $db;
      }		
     
    }
    -> affiche.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    require 'ListeLivres.class.php';
    require 'ManagerLivres.class.php';
     
    $db = new PDO('mysql:host=localhost;dbname=insert_reference', 'root', '');
    $manager = new Manager($db);
    $livres= $manager->getList();
    foreach($livres as $livre){
        echo '<p>'.$livre->titre().'.</p>';	
    	echo '<p>'.$livre->isbn().'</p>';	
    	echo '<p>'.$livre->librairie().'</p>';
    	echo '<p>'.$livre->genre().'</p>';
    }
    Je souhaite ajouter une méthode à la classe ManagerLivres.class.php : la possibilité d'afficher ma liste de livres après une recherche multi-critères.
    Actuellement, j'utilise le code procédural suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    $id_livre = (int)(iSset($_POST['id_livre'])) ?  $_POST['id_livre'] : null;
    $isbn = (int)(iSset($_POST['isbn'])) ?  $_POST['isbn'] : null;
    $id_librairie = (int)(iSset($_POST['id_librairie'])) ?  $_POST['id_librairie'] : null;
    $id_genre = (int)(iSset($_POST['id_genre'])) ?  $_POST['id_genre'] : null;
     
    $db = mysql_connect("localhost","root", "")  or die ('erreur de connexion');
    mysql_select_db('insert_reference',$db);
    mysql_set_charset( 'utf8' );
     
    $select = 'SELECT SQL_CALC_FOUND_ROWS L.ID_LIVRE,titre,miniature,DATE_ACHAT,DATE_PUBLICATION,NB_PAGES,
    sous_titre,RESUME,commentaires';
    $from = 'FROM LIVRE L';
    $jointure='';
    $where = array();
     
    if($id_genre != null)
    {
    $select .=',G.NOM_GENRE, G.ID_GENRE';
    $jointure=' INNER JOIN THEMATISE T ON T.ID_LIVRE = L.ID_LIVRE INNER JOIN GENRE G ON T.ID_GENRE = G.ID_GENRE';
    $where[] ='G.id_genre = '.$id_genre;
    }
     
    if($id_librairie != null)
    {
    $select .=',LIB.ID_LIBRAIRIE,LIB.NOM_LIBRAIRIE';
    $jointure .=' INNER JOIN LIBRAIRIE LIB ON LIB.ID_LIBRAIRIE = L.ID_LIBRAIRIE ';
    $where[] ='LIB.id_librairie = '.$id_librairie;
    }
     
    [... idem pour les autres critères de recherche]
     
    $sqlWhere = (empty($where)) ? null : 'WHERE '.implode(' AND ', $where);
    $sql = $select.' '.$from.' '.$jointure.' '.$sqlWhere;
     
    $query = mysql_query($sql);
     
    $html ='';
    while ($row = mysql_fetch_array($query)) {
    $html .= '<p>'.strip_tags($row['titre']).'</p>';
    $html .= '<p>'.strip_tags($row['NOM_GENRE']).'</p>';
    [...]           
    }
     
    $data = array('content'=> $html);
     
    header('Content-type: application/json');
     
    echo json_encode($data);
     
    //exploitation du résultat avec ajax
    Etant débutant en POO, pouvez-vous m'aider à implémenter le code ci-dessus dans une nouvelle méthode de ma classe ManagerLivres.class.php ? Merci.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonjour,

    Pour arriver à mes fins, je pensais à la solution suivante : ajouter un paramètre (tableau) à la fonction getList()
    => getList(array $recup_post). En fonction du contenu du tableau (tableau $_POST récupéré dans le fichier affiche.php), je pourrais construire dans ma fonction ma requête personnalisée, découlant des critères de filtre, ces derniers étant connus grâce aux clefs du tableau.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Array
    (
        [id_livre] =>
        [isbn] => 9782
        [id_librairie] => 
        [id_genre] => 
     
    )
    En fonction de la valeur de chaque clé (critère), je personnalise ma requête (en l'espèce je filtre par isbn seulement).
    Tout cela reste théorique, c'est pourquoi j'aurais besoin de votre aide. Merci.

  3. #3
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Ca me paraît très bien ton dernier projet.
    Ca pourrait commencer comme ça... je ne vois pas trop ce qui te bloque par rapport à ta fonction procédurale ? Il n'y a pas grand chose à changer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public function getList($filtres=array()){//ici cela signifie : si l'on ne met pas de paramètres, met ceci par défaut, sinon, prend le paramètre que l'on te passe
       if(sizeof($filtres)==0){//recherche sans filtre telle que tu l'as déjà codée
          $where='';
       }
       else{//recherche avec filtre(s) tel que tu l'as déjà codée
          foreach($filtres as $filtre){
             //ici tu concatènes ton where...
          }
       }
       //ici tu as ton $sql définitif et tu ne codes qu'une fois toute la procédure de lancement et de récupération.
    $sql='SELECT L.TITRE AS titre,L.ISBN AS isbn,L.SOUS_TITRE AS sous_titre,LEFT(L.TITRE,50)AS extrait_titre, L.ID_LIVRE AS id_livre,
    L.DATE_ACHAT AS date_achat,L.DATE_PUBLICATION AS date_publication,L.DATE_LECTURE AS date_lecture,  L.fichier_couverture_recto AS couverture_recto, L.miniature,  
    ED.NOM_EDITEUR AS editeur,ED.ID_EDITEUR AS id_editeur,LIB.NOM_LIBRAIRIE AS librairie,LIB.ID_LIBRAIRIE AS id_librairie,FORM.NOM_FORMAT AS format,FORM.ID_FORMAT AS id_format, L.COMMENTAIRES AS commentaires,
    L.RESUME AS resume,LEFT(L.RESUME,215)AS extrait, L.STATUT_LECTURE AS statut_lecture, L.APPRECIATION AS appreciation, L.NB_PAGES AS nb_pages,G.NOM_GENRE as genre, G.ID_GENRE
     
     
    FROM LIVRE L
    INNER JOIN EDITEUR ED		
    ON ED.ID_EDITEUR = L.ID_EDITEUR	
     
    INNER JOIN LIBRAIRIE LIB		
    ON LIB.ID_LIBRAIRIE = L.ID_LIBRAIRIE
     
    INNER JOIN FORMAT FORM		
    ON FORM.ID_FORMAT = L.ID_FORMAT
     
    INNER JOIN THEMATISE T ON T.ID_LIVRE = L.ID_LIVRE
    INNER JOIN GENRE G ON T.ID_GENRE = G.ID_GENRE '.$where.' order by 1,3;';
     
       //à toi de continuer
    }
     
    //Ainsi pour convoquer ta méthode
    $foo=$manager->getList();
    //ou
    $foo=$manager->getList($curFiltres);
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Merci Dentrite, je vais tester tout cela et reviendrai poster si j'ai besoin d'une aide complémentaire.

Discussions similaires

  1. [MySQL] Requete SQL pour faire une recherche multi critères
    Par nassing dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 19/05/2011, 17h01
  2. Traiter le résultat d'une recherche multi-critères
    Par draxweb dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 15/03/2007, 19h00
  3. Trier les réponses d'une recherche multi-critères
    Par bétécé dans le forum Access
    Réponses: 6
    Dernier message: 25/01/2007, 09h56
  4. Procédure pour la recherche multi-critères
    Par Lycoz dans le forum Access
    Réponses: 5
    Dernier message: 22/09/2006, 14h11
  5. exporter le résultat d'une recherche multi-critère ?
    Par Tetsuotil dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 18/07/2006, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo