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 :

Concaténation de requête SQL avec PDO


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Concaténation de requête SQL avec PDO
    Bonjour à tous,

    Je développe un module de recherche sur mon site, et le problème se pose lors de la génération de la requête SQL (j'utilise PDO). J'ai plein de champs différents (et de tables différentes aussi), donc j'ajoute des portions de requête en fonction du fait que la variable de recherche soit vide ou non, ou en fonction de sa valeur.

    Voici un exemple de code:

    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
     
    if($couleur == 1){
                $orCoul = "OR couleur_chaussure = :coul_chaussure";
            }else{
                $orCoul = "";
            }
            if($couleur == 2){
                $andCoul = "AND couleur_haut = :coul_haut";
            }else{
                $andCoul = "";
            }
            if($couleur == 3){
                $orCoul2 = "OR couleur_bas = :coul_bas";
            }else{
                $orCoul2 = "";
            }
            $requete = $this->getDb()->prepare("
                    SELECT id_utilisateur, id_societe, prenom, nom, societe, ville, pays
                    FROM utilisateurs, couleur
                    WHERE //liaison...
                    AND (id_utilisateur = :id_utilisateur OR id_utilisateur = :id_utilisateur2)
                    AND (id_teinte_globale = :teinte $orCoul $orCoul2)
                    $andCoul
            ");
            $requete->bindValue(':id_produit', "157", PDO::PARAM_INT);
            $requete->bindValue(':id_produit2', "149", PDO::PARAM_INT);
            $requete->bindValue(':id_teinte_globale', "2", PDO::PARAM_INT);
            if($couleur == 1){
                $requete->bindValue(':couleur_chaussure', $couleur_chaussure, PDO::PARAM_STR);
            }
            if($couleur == 2){
                $requete->bindValue(':couleur_haut', $couleur_haut, PDO::PARAM_STR);
            }
            if($couleur == 3){
                $requete->bindValue(':couleur_bas', $couleur_bas, PDO::PARAM_STR);
            }
            if($requete->execute(array(":pays" => "fr"))) { return $requete->fetchAll(PDO::FETCH_ASSOC);} else {return false;}
    Sauf que ce genre de méthode quand on a des dizaines de champs de recherche devient très compliquée avec PDO. Notamment pour attribuer les bonnes valeurs aux bindValues.
    Auriez-vous une méthode plus simple?
    J'ai pris connaissance de PDO::quote, mais c'est sans plus au niveau de la sécurité apparemment.

    Merci d'avance de votre aide.

  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
    Par exemple :
    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
    $orCouleur = "";
    $andCouleur = "";
    $param[':pays'] = 'fr';
    if($couleur == 1){
        $orCouleur = "OR couleur_chaussure = :couleur_chaussure";
    	$param[':couleur_chaussure'] = $couleur_chaussure;
    }
    elseif ($couleur == 2) {
    	$andCouleur = "AND couleur_haut = :couleur_haut";
    	$param[':couleur_heut'] = $couleur_haut;
    }
    elseif ($couleur == 3) {
    	$orCouleur = "OR couleur_bas = :couleur_bas";
    	$param[':couleur_bas'] = $couleur_bas;
    }
     
    .....
     
    $requete->execute($param);
    Si tu as besoin de plus de factorisation encore, tu peux faire des fonctions, des classes etc.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup Sabotage.

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

Discussions similaires

  1. Requête SQL avec concaténation
    Par naka2030 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/11/2012, 15h24
  2. [PDO] requête sql avec PDO impossible
    Par HALOMOTO dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/03/2009, 00h17
  3. [MySQL] concaténer une requête sql avec condition
    Par maliak dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 10/02/2006, 12h01
  4. Une requête SQl avec concaténation
    Par Bobybx dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/01/2006, 10h18
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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