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 :

Requête aux champs facultatifs


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut Requête aux champs facultatifs
    Bonjour,

    Mon formulaire présente des champs facultatifs j'ai donc essayé de bricoler un truc qui en pdo ne fonctionne pas, j'ai systématiquement le message que le nombre de paramètres fournis est invalide.

    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
     
    $sql = "SELECT * FROM membres WHERE sexe = :sexe";
    $stmt = $dbh->prepare($sql);
    	$stmt->BindParam(':sexe', $sexe);
     
     
    	if($age_min && $age_max != "")
    		{
    		$sql .= " AND annee_naissance BETWEEN :age_min AND :age_max";
    		$stmt->BindParam(':age_min', $age_min);
    		$stmt->BindParam(':age_max', $age_max);
    		}
     
    		if($age_max != "")
    		{
    		$sql .= " AND age_max = :age_max";
    		$stmt->BindParam(':age_max', $age_max);
    		}
    		if($couleur_yeux != "")
    		{
    		 $sql .= " AND couleur_yeux = :couleur_yeux";
    		 $stmt->BindParam(':couleur_yeux', $couleur_yeux);
    		}
    		if($couleur_cheveux != "")
    		{
    		$sql .= " AND couleur_cheveux = :couleur_cheveux";
    		$stmt->BindParam(':couleur_cheveux', $couleur_cheveux);
    		}
     
    		if($corpulence != "")
    		{
    		$sql .= " AND corpulence = :corpulence";
    		$stmt->BindParam(':corpulence', $corpulence);
    		}
    	if($style_vestimentaire != "")
    		{
    		$sql .= "AND style_vestimentaire = :style_vestimentaire";
    		$stmt->BindParam(':style_vestimentaire', $style_vestimentaire);
    		}
    		if($departement != "")
    		{
    		$sql .= "AND departement = :departement";
    		$stmt->BindParam(':departement', $departement);
    		}
     
    		$stmt->execute();
    Merci d'avance pour vos lumières

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu ne précises pas ton problème mais je suppose que tu ne peux lier des paramètres qui n'existaient pas lors du prepare.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu ne précises pas ton problème mais je suppose que tu ne peux lier des paramètres qui n'existaient pas lors du prepare.
    Salut,

    Lors d'une requete normale (pas de pdo) je procedais de cette façon :

    CODE]$sql = "SELECT * FROM membres, ph_normale WHERE membres.sexe = $sexe AND ph_normale.type_photo = 'principale' AND ph_normale.pseudo = membres.pseudo";[[/CODE]

    puis pour les champs facultatifs je mettais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql .= " AND membres.annee_naissance BETWEEN $age_min AND $age_max";
    Avec pdo il faut en plus utiliser BindParam ou BindValue or
    je ne peux utiliser cette fonction que pour les champs présents dans la requete et cette fonction doit être utilisée après prepare.

    Pour mon code php, la chose suivante ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $sql = "SELECT * FROM membres, ph_normale WHERE membres.sexe = :sexe AND ph_normale.type_photo = 'principale' AND ph_normale.pseudo = membres.pseudo";
    $stmt = $dbh->prepare($sql);
    $stmt->BindParam(':sexe', $sexe);
     
    $sql .= " AND membres.annee_naissance BETWEEN :age_min AND :age_max";
    $stmt->BindParam(':age_min', $age_min);
    $stmt->BindParam(':age_max', $age_max);
    Or, en placant la jointure (second $sql) juste après le premier (et en laissant tout le reste tel quel) la requete fonctionne.

    Ma question est donc : Si tous les champs ne sont pas obligatoires comment faire pour que les variables de ces champs ainsi queBindParam ne soient utilisés que quand les champs sont remplis.

    Je sais pas si j'ai été très clair dans mon explication mais bon

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Comme je t'ai dis, ça doit être fait en deux temps :
    1 construire la requete
    2 lier les paramètres
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Comme je t'ai dis, ça doit être fait en deux temps :
    1 construire la requete
    2 lier les paramètres
    Oui ok j'ai bien compris.
    Cela dit, la seule solution que j'ai trouvée est celle ci-dessous; n'y a t-il riend e plus simple que de réecrire 2 fois les memes conditions (chose que je voulais éviter) ?


    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
    $sql = "SELECT * FROM membres, ph_normale WHERE membres.sexe = :sexe AND ph_normale.type_photo = 'principale' AND ph_normale.pseudo = membres.pseudo";
    		if($age_min && $age_max != "")
    			{
    			$sql .= " AND membres.annee_naissance BETWEEN :age_min AND :age_max";
    			}
     
    		if($age_max != "")
    			{
    			$sql .= " AND membres.age_max = :age_max";
    			}
    		if($couleur_yeux != "")
    			{
    			 $sql .= " AND membres.couleur_yeux = :couleur_yeux";
    			}
    		if($couleur_cheveux != "")
    			{
    			$sql .= " AND membres.couleur_cheveux = :couleur_cheveux";
    			}
     
    		if($corpulence != "")
    			{
    			$sql .= " AND membres.corpulence = :corpulence";
    			}
    		if($style_vestimentaire != "")
    			{
    			$sql .= "AND membres.style_vestimentaire = :style_vestimentaire";
    			}
    		if($departement != "")
    			{
    			$sql .= "AND membres.departement = :departement";
    			}
    		$stmt = $dbh->prepare($sql);
    		$stmt->BindParam(':sexe', $sexe);
     
     
    		if($age_min && $age_max != "")
    			{
    			$stmt->BindParam(':age_min', $age_min);
    			$stmt->BindParam(':age_max', $age_max);
    			}
     
    		if($age_max != "")
    			{
    			$stmt->BindParam(':age_max', $age_max);
    			}
    		if($couleur_yeux != "")
    			{
    			 $stmt->BindParam(':couleur_yeux', $couleur_yeux);
    			}
    		if($couleur_cheveux != "")
    			{
    			$stmt->BindParam(':couleur_cheveux', $couleur_cheveux);
    			}
     
    		if($corpulence != "")
    			{
    			$stmt->BindParam(':corpulence', $corpulence);
    			}
    		if($style_vestimentaire != "")
    			{
    			$stmt->BindParam(':style_vestimentaire', $style_vestimentaire);
    			}
    		if($departement != "")
    			{
    			$stmt->BindParam(':departement', $departement);
    			}

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Un truc un peu fou :
    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
    <?php
    $sql_param = array();
     
    $lstCriteres[] = array
    (
       'var'=>'couleur_yeux',
       'comparateur'=>'=',
    );
     
    $lstCriteres[] = array
    (
       'var'=>'age_min',
       'comparateur'=>'>',
    );
     
    $sql_criteres = array();
    foreach($lstCriteres as $values) {
       if (isset($$values['var']) && $$values['var'] != "")  {
           $sql .= " AND membres." . $values['var'] . $values['comparateur'] . ":" . $values ['var'];
           $sql_param[':' . $values ['var']] = $$values ['var'];
       }
    }
     
    $stmt = $dbh->prepare($sql);
    $stmt->execute($sql_param);
     
    ?>
    bon la j'ai utilisé a l'extreme le fait que tes variables, tes paramètres, tes champs portent le meme nom.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. accès aux champs d'une requête SELECT
    Par acheo dans le forum C#
    Réponses: 8
    Dernier message: 04/10/2011, 10h09
  2. [MySQL] Requête sur 3 tables aux champs identiques
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/11/2008, 12h35
  3. Réponses: 10
    Dernier message: 24/01/2005, 17h00
  4. Requête et champs nuls
    Par Argonan dans le forum Access
    Réponses: 2
    Dernier message: 12/10/2004, 15h42
  5. [Flash MX ]Acceder aux champs d'un Objet
    Par yacinechaouche dans le forum Flash
    Réponses: 3
    Dernier message: 15/04/2004, 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