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 :

Problème Pdo et champs vide [PDO]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut Problème Pdo et champs vide
    Bonjour à vous,

    j'ai un problème avec pdo que je n'arrive pas à comprendre.


    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
     
    $champRecherche= array('nom', 'diplome1','diplome2','salaire','statut','mobs','tags');
    foreach ($champRecherche as $key) {
        if(!isset($_POST[$key] )){
    		$_POST[$key]="";
    	}
    }
    if(is_array($_POST['tags'])){
    	$tags = implode(",",$_POST['tags']);
    }
    if(is_array($_POST['mobs'])){
    	$mobs = implode(",",$_POST['mobs']);
    }
     
    $sqlCount="SELECT COUNT(ID) nb FROM candidat C";
    $sqlWhere=" WHERE (C.nom LIKE :nom)
    AND ( (:diplome1 = '' AND :diplome2 = '') OR (C.annee BETWEEN :diplome1 AND :diplome2) )
    AND( (((C.salaire_actuel <>0 
    	AND C.salaire_demande <>0) 
    	AND (C.salaire_actuel <= :salaire OR C.salaire_demande <= :salaire)) 
    	OR (C.salaire_actuel =0 AND C.salaire_demande <= :salaire AND C.salaire_demande <>0) 
    	OR (C.salaire_actuel <= :salaire AND C.salaire_actuel <>0 AND C.salaire_demande =0) 
    	OR (C.salaire_actuel=0 AND C.salaire_demande =0)) OR :salaire = '' )
    AND ( :statut = '' OR C.statut_ID = :statut )
    AND ( :mobs = '' OR C.ID IN (SELECT candidat_ID FROM candidatmobilite WHERE mobilite_ID IN (:mobs)) )
    AND ( :tags = '' OR C.ID IN (SELECT candidat_ID FROM candidattags WHERE tags_ID IN (:tags)) ) ";
     
    $nom = $_POST['nom']."%";
    $req = $pdo->prepare($sqlCount.$sqlWhere);
    $req->bindParam(':nom', $nom, PDO::PARAM_STR);
    $req->bindParam(':diplome1', $_POST['diplome1'], PDO::PARAM_INT);
    $req->bindParam(':diplome2', $_POST['diplome2'], PDO::PARAM_INT);
    $req->bindParam(':salaire', $_POST['salaire'], PDO::PARAM_INT);
    $req->bindParam(':statut', $_POST['statut'], PDO::PARAM_INT);
    $req->bindParam(':mobs', $mobs, PDO::PARAM_STR);
    $req->bindParam(':tags', $tags, PDO::PARAM_STR);
    Lorsque je laisse tout mes paramètres vide il me retourne 0

    alors que si je test cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT COUNT(ID) nb FROM candidat C
     WHERE (C.nom LIKE '%')
    AND ( ('' = '' AND '' = '') OR (C.annee BETWEEN '' AND '') )
    AND( (((C.salaire_actuel <>0 
    	AND C.salaire_demande <>0) 
    	AND (C.salaire_actuel <= '' OR C.salaire_demande <= '')) 
    	OR (C.salaire_actuel =0 AND C.salaire_demande <= '' AND C.salaire_demande <>0) 
    	OR (C.salaire_actuel <= '' AND C.salaire_actuel <>0 AND C.salaire_demande =0) 
    	OR (C.salaire_actuel=0 AND C.salaire_demande =0)) OR '' = '' )
    AND ( '' = '' OR C.statut_ID = '' )
    AND ( '' = '' OR C.ID IN (SELECT candidat_ID FROM candidatmobilite WHERE mobilite_ID IN ('')) )
    AND ( '' = '' OR C.ID IN (SELECT candidat_ID FROM candidattags WHERE tags_ID IN ('')) )
    Il me retourne bien le count de tous mes candidats présents dans la base c'est bien ce que j'attends.

    Je suppose que PDO ne gère pas les paramètres vide de la même façon ?
    j'ai vu qu'il retourne 0 pour les int si la chaine passée est vide donc j'ai aussi testé avec PDO:ARAM_STR partout mais même résultat un count 0

    Je suppose que je ne devrais pas construire ma requête comme ça avec PDO donc selon vous quelle est la meilleur façon sachant qu'avant c'était fait avec beaucoup de condition (test si la valeur post existe etc...) et que je voulais éviter tout ça.

    Merci à vous

  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
    Ca ne fait pas une immensité de conditions non plus et ça allège la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (isset($_POST['status'])) {
       $req->bindParam(':statut', $_POST['statut'], PDO::PARAM_INT);
       $sqlWhere .= " AND ( :statut = '' OR C.statut_ID = :statut )";
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Cela me pose un problème avec l'instance de l'objet PDO, en effet je suis obligé avant de faire les bindParam d'instancier mon objet et donc de lui fournir la chaine de requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = $pdo->prepare($sqlCount.$sqlWhere);
    Il y a une autre façon de procéder ?

  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
    Effectivement ... moi je faisais comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (isset($_POST['status'])) {
       $param[':status'] = $_POST['statut'];
        $sqlWhere .= " AND ( :statut = '' OR C.statut_ID = :statut )";
    }
    $req = $pdo->prepare($sqlCount.$sqlWhere);
    $req->execute($param);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Merci pour ces précisions

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

Discussions similaires

  1. [AC-2003] Problème ouverture formulaire champs vide
    Par alu1308 dans le forum IHM
    Réponses: 3
    Dernier message: 18/07/2013, 14h48
  2. Problème sur les champs vide/null
    Par straahd2 dans le forum Designer
    Réponses: 2
    Dernier message: 22/12/2011, 11h07
  3. [MySQL] Moteur de recherche multi critére - Probléme affichage si champs vide
    Par karpe dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 28/02/2010, 20h59
  4. problème de sélection avec les champs vides
    Par danathane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/08/2007, 16h45
  5. Réponses: 12
    Dernier message: 18/07/2006, 17h36

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