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

PHP & Base de données Discussion :

Plusieurs paramètres dynamiques dans une méthode ? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 497
    Points : 194
    Points
    194
    Par défaut Plusieurs paramètres dynamiques dans une méthode ?
    Bonjour,
    j'ai une méthode et j'aimerai avoir plussieurs paramètres pour ajouter autant de condition dans ma requete, sans connaître le champs à comparer, j'ai penser au tableau mais je ne vois pas comment m'y prendre. Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	function getCategorie(array $champs[], array $aleur[])
    	{
    		$sql="SELECT * FROM categorie WHERE $champs[]=$aleur[]";
    		$result=parent::select($sql);
    		return $result;
    	}

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 774
    Points : 936
    Points
    936
    Par défaut
    je pense qu'il est preferable (pour ma part) de faire une fonction qui construit la requete et une autre qui l'execute.
    le fonction qui construit la requete pourrait ressembler à ça

    Code php : 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
    function execSQL($sql){
       //execute la requete construite à l'aide de la fonction getSQL
    }
     
    function getSQL($sql, $champs, $valeur,$operator)
    	{
    		$sql=$sql." and $champ $operator $valeur ";		
    		return $sql;
    	}
    //tu pourrait constituer la liste de tes parametres (et de leur valeur) dans un 
    // et tu fais une boucle sur la fonction getSQL
    //soit $TabListParam le tableau contenant la liste des parametre
    //et $valeurParam le tableau contenant leur valeur
    //tu pourras choisir de faire un tableau a double entree
    $i=0;
    $sql="SELECT * FROM categorie WHERE 1"
    foreach($TabListParam as $param){
       $sql=getSQL( $sql,$param, $valeurParam[$i] ,"=");
       $i++;
    }

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Il faut construire ta requête sql au fur et à mesure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "SELECT * FROM categorie WHERE 1 ";
    for($i = 0; $i < sizeof($champs); $i++) {
      $sql = $sql . " and $champs[$i] = '$aleur[$i]";
    }
    En vérifiant avant que tes 2 arguments ont le même type d'élément et en protégeant ta requête à la fin avec mysql_real_escape_string ou équivalent.


    Edit : grillé

  4. #4
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 497
    Points : 194
    Points
    194
    Par défaut
    en faite j'ai fait ça:
    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
    equire('class/class.pdo.php');
    /////////////////////////////////////
    class Model extends Connection
    {
    	private $sql;
    	public function __construct () 
    	{
    		parent::__construct();
    	}
    // categorie
    	public function getCategorie($champ = '', $valeur= '')
    	{
    		if(isset($champ) && !empty($champ) && isset($valeur) && !empty($valeur))
    			$this->sql="SELECT * FROM categorie WHERE $champ=$valeur";
    		else
    			$this->sql="SELECT * FROM categorie";
    		$result=parent::select($this->sql);
    		return $result;
    	}
    donc sa fonctionne mais je ne peux mettre qu'un couple valeur champs, c'est le principale, si j'ai besoin je ferai une requête mais bon je ne suis pas trop content. J'attend mieux de mon model ?
    Peux ont faire mieux (surement) ?
    Merci

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Je me contenterais de créer des méthodes en fonction de mes besoins.

    L'appli nécessite de lire toutes les catégories alors je créé getCategories.
    L'appli nécessite de rechercher dans mes catégories, alors je créé searchCategories.
    L'appli nécessite de lire les catégories d'un article, alors je créé une méthode getCategorieByArticle.
    ect ect

    Solution simple qui duplique un peu de code... Mais qui à l'avantage de se rapprocher du besoin et moins du model.
    Sachant que le besoin si il est bien défini varie peu, alors tes méthodes devraient peu changer au cours du temps.

    Après tu peu travailler à une factorisation du code, si tu penses que cela est faisable et nécessaire.

    Par contre tu comptes gérer comment le jour ou tu créé des catégories d'articles et des catégories de livres avec une seule classe Model ?
    Ne devrais tu pas renommer ta classe de manière à la rapprocher de ton domaine de gestion ?

    bye

  6. #6
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 497
    Points : 194
    Points
    194
    Par défaut
    j'ai constaté en faisant mes méthodes que des get/set il y'en a partout de plus eclipse fabrique les accesseur en fonction des variables d'instances.

    Pour renommé la classe je suis d'accord avec toi... Et je vais m'y attablé.
    Merci pour ces lumières, qui mon éclairées.

  7. #7
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 497
    Points : 194
    Points
    194
    Par défaut
    j'ai trouvé mieux
    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
    <?php
    require('class.pdo.php');
    class ModelAdminBoutique extends Connection
    {
    	private $langue='fr';
    	private $tableCategorie='categorie';
    	private $sql;
     
    	function __construct()
    	{
    		parent::__construct();
    	}
     
    	public function getCategorie($parametre = '')
    	{
    		if(!is_array($parametre)) $parametre[] = array();
    		if(!isset($parametre['champ'])) $parametre['champ']='*';
    		$parametre['tableCategorie'] = $this->tableCategorie;
    		if(!isset($parametre['langue'])) $parametre['langue']=$this->langue;
    		if(!isset($parametre['order'])) $parametre['order']='code';
     
    		if(!is_array($condition)) $condition[] = array();
    		if(strlen($parametre['langue']) == 2) { $langue=$parametre['langue']; $condition[] = " langue LIKE $langue"; }
    		if(strlen($parametre['code']) == 2) { $order=$parametre['code']; $condition[] = " AND code LIKE $order"; }
     
    		$requete="SELECT ".$parametre['champ']." FROM ".$parametre['tableCategorie']." WHERE ";
    		for($i=1; $i<count($condition); $i++)
    			$requete.=' '.$condition[$i];
    		if(strlen($parametre['order']) > 0) $requete.= ' ORDER BY '.$parametre['order']; 
    		$this->sql=$requete;
    		echo $this->sql;
    		$result=parent::select($this->sql);
    		return $result;
    	}
    }
    $parametre=array('champ' => 'nom', 'order' => 'nom', 'langue' => 'fr');
    $modelAdmin = new ModelAdminBoutique();
    foreach($modelAdmin->getCategorie($parametre) as $val)
    {
    	echo $val['nom'];
    }
    ?>
    Problème:
    la requete affichée ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom FROM categorie WHERE langue LIKE fr ORDER BY nom
    Merci

  8. #8
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Il te manque des quotes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom FROM categorie WHERE langue LIKE 'fr' ORDER BY nom
    Autant utiliser = à la place de LIKE d'ailleurs, si tu n'utilises pas de joker.

  9. #9
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 497
    Points : 194
    Points
    194
    Par défaut
    oui effectivement j'avais poster un new message pour ça.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Insérer un paramètre dynamique dans une macro pour l'appel d'une fonction
    Par OphyTe dans le forum Macros Access
    Réponses: 11
    Dernier message: 10/02/2015, 15h01
  2. Paramètre dynamique dans une requête
    Par labib23dz dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 09/04/2012, 12h03
  3. Passage de paramétre dynamique dans une requete SQL
    Par d.tellier dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/01/2010, 12h57
  4. Paramètre facultatif dans une méthode
    Par callo dans le forum C#
    Réponses: 4
    Dernier message: 26/06/2008, 17h45
  5. Réponses: 3
    Dernier message: 25/04/2006, 10h30

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