1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2009
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 58
    Points : 13
    Points
    13

    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
    23 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 23 648
    Points : 34 792
    Points
    34 792

    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 )";
    }

  3. #3
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2009
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 58
    Points : 13
    Points
    13

    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
    23 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 23 648
    Points : 34 792
    Points
    34 792

    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);

  5. #5
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2009
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 58
    Points : 13
    Points
    13

    Par défaut

    Merci pour ces précisions

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

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