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

    Informations forums :
    Inscription : juillet 2005
    Messages : 23 914
    Points : 35 172
    Points
    35 172

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

    Informations forums :
    Inscription : juillet 2005
    Messages : 23 914
    Points : 35 172
    Points
    35 172

    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.

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. 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