Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/11/2012, 10h29   #1
scude
Candidat au titre de Membre du Club
 
Inscription : 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
scude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 10h43   #2
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 828
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 828
Points : 21 871
Points : 21 871
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 )";
}
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 11h55   #3
scude
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 58
Points : 12
Points : 12
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 ?
scude est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/11/2012, 15h45   #4
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 828
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 828
Points : 21 871
Points : 21 871
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);
sabotage est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/11/2012, 16h32   #5
scude
Candidat au titre de Membre du Club
 
Inscription : juillet 2009
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 58
Points : 12
Points : 12
Merci pour ces précisions
scude est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h32.


 
 
 
 
Partenaires

Hébergement Web