Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  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 : 12
    Points
    12

    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 :
    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 :
    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 Vincent
    Inscrit en
    juillet 2005
    Messages
    20 909
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 909
    Points : 27 295
    Points
    27 295

    Par défaut

    Ca ne fait pas une immensité de conditions non plus et ça allège la requête :

    Code :
    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 : 12
    Points
    12

    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 :
    $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 Vincent
    Inscrit en
    juillet 2005
    Messages
    20 909
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 20 909
    Points : 27 295
    Points
    27 295

    Par défaut

    Effectivement ... moi je faisais comme ça
    Code :
    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 : 12
    Points
    12

    Par défaut

    Merci pour ces précisions

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •