Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/11/2011, 19h47   #1
Invité de passage
 
Inscription : janvier 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 7
Points : 1
Points : 1
Envoyer un message via MSN à killgors
Par défaut pdo - requete prepare qui ne retourne rien

Bonjour à tous!


J'ai un problème avec une fonction préparé pdo depuis des jours et je trouve pas la solution alors je viens vous voir, peut-être que quelqu'un saura m'aider...

Voici la requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
$this->requetePrepareRecherche = $this->db->getConnexion()->prepare("SELECT tmp.id,get_distance_metres(:latitudePointCentral, :longitudePointCentral, tmp.latitude, tmp.longitude) distance ,COUNT(tmp.id) cpt  FROM  
					(
					select u.latitude, u.longitude, u.id from UTILISATEUR u inner join COMPETENCES c on u.id=c.id_utilisateur where c.id_metier IN (:competence1) and dateDeNaissance between :date_inf and :date_inf and derniere_connexion between :date_derniereConnexion_inf and :date_derniereConnexion_sup and is_active=1
					UNION ALL
					select u.latitude, u.longitude, u.id from UTILISATEUR u inner join COMPETENCES c on u.id=c.id_utilisateur where c.id_metier IN (:competence2) and dateDeNaissance between :date_inf and :date_inf and derniere_connexion between :date_derniereConnexion_inf and :date_derniereConnexion_sup and is_active=1
					UNION ALL
					select u.latitude, u.longitude, u.id from UTILISATEUR u inner join COMPETENCES c on u.id=c.id_utilisateur where c.id_metier IN (:competence3) and dateDeNaissance between :date_inf and :date_inf and derniere_connexion between :date_derniereConnexion_inf and :date_derniereConnexion_sup and is_active=1
					)tmp
group by tmp.id 
having distance < :distanceMax
order by cpt desc")
et voici comment je l'appelle :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$this->requetePrepareRecherche->bindValue(':competence1', $competencePrincipalRechercheParam, PDO::PARAM_INT);
			$this->requetePrepareRecherche->bindValue(':competence2', $competenceSecondaireRecherche1Param, PDO::PARAM_INT);
			$this->requetePrepareRecherche->bindValue(':competence3', $competenceSecondaireRecherche2Param, PDO::PARAM_INT);
			$this->requetePrepareRecherche->bindValue(':date_inf', $date_inf, PDO::PARAM_STR);
			$this->requetePrepareRecherche->bindValue(':date_sup', $date_sup, PDO::PARAM_STR);
			$this->requetePrepareRecherche->bindValue(':date_derniereConnexion_inf', $date_derniereConnexion_inf, PDO::PARAM_STR);
			$this->requetePrepareRecherche->bindValue(':date_derniereConnexion_sup', $date_derniereConnexion_sup, PDO::PARAM_STR);
			$this->requetePrepareRecherche->bindValue(':latitudePointCentral', $latitudeParam, PDO::PARAM_INT);
			$this->requetePrepareRecherche->bindValue(':longitudePointCentral', $longitudeParam, PDO::PARAM_INT);
			$this->requetePrepareRecherche->bindValue(':distanceMax', $distanceMaxParam, PDO::PARAM_INT);
 
				//les données sont retournée sous forme d'objet;
			$associe=$this->requetePrepareRecherche->fetchAll(PDO::FETCH_OBJ)or die(print_r($this->requetePrepareRecherche->errorInfo(), TRUE));;
 
//	print $associe;
	print "<br/>".var_dump($associe);
et enfin voici ce qu'affiche le print à la fin :

Code :
Array ( [0] => 00000 [1] => [2] => )
J'ai aussi printé toutes les valeurs passé en param :

Code :
1
2
3
4
5
6
7
8
9
10
liste : 20,19,18,17,16,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
liste2 : 20,19,18,17,16,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
liste3 : 20,19,18,17,16,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
date_inf : 1911-11-11
date_sup : 1993-11-11
date_derniereConnexion_inf : 2011-08-11
date_derniereConnexion_sup : 2011-11-12
latitudePointCentral : 48.8582
longitudePointCentral : 2.29452
distanceMaxParam : 10000000

Mon problème est que cette fonction ne retourne rien, alors que si je la colle dans phpmyadmin en remplaçant les variable par leur valeur et en ajoutant des quote autour des dates j'ai des données qui me sont retournées.

Avant d'utiliser bindvalue j'utilisait execute avec un tableau mais le résultat était le même...

get_distance_metres est une fonction mysql qui fonctionne, pas de problème de ce côté la. Je pense que je dois avoir une erreur au niveau du passage des paramètres mais je vois pas ou...

Quelqu'un aurait une idée? merci d'avance...
killgors est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 20h03   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
1 paramètre = 1 valeur et non plusieurs (rapport aux liste, liste2, liste3 et IN).

Si je ne me trompe pas (cf la requête finale), en tant que liste d'entiers, elle sera alors tronquée à la première virgule donc une valeur (la première) entière. Et, en chaîne, ça ne fonctionnerait pas non plus (avec l'ajout des quotes, ça ne donnerait qu'une chaîne littérale comportant le tout). Il faut procéder autrement (abandonner le préparé ?).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 20h11   #3
Invité de passage
 
Inscription : janvier 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 7
Points : 1
Points : 1
Envoyer un message via MSN à killgors
Je viens de tester en remplaçant les IN par des = 35

Ca devrait me retourner une valeur, le 35 correspondant à une compétence d'une personnes, mais le résultat est le même...C'est possible que ce soit une erreur de sql et que cette erreur ne soit pas affichée?

Merci de ton aide!
killgors est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 20h19   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
t'as activé la gestion des erreurs ?
http://php.net/manual/fr/pdo.error-handling.php
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 20h39   #5
Invité de passage
 
Inscription : janvier 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 7
Points : 1
Points : 1
Envoyer un message via MSN à killgors
oui a l'instanciation de mon objet :

new PDO('mysql:host=127.0.0.1;dbname=nomBase', 'root', 'romain', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

Et aucune erreur ne s'affiche, ca serait plus simple sinon ^^


Le probleme pourrait venir de la procédure stocké qui ne serait pas bien utilisée?
killgors est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 21h04   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
ton display_errors est bien sur On ? et ton error_reporting sur E_ALL | E_STRICT

ps : surtout pas de or die pour debugger du PDO
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 20h33   #7
Invité de passage
 
Inscription : janvier 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 7
Points : 1
Points : 1
Envoyer un message via MSN à killgors
oui oui tout ca est bien activé...j'ai déjà eu des erreurs dans du code pdo et à chaque fois pdo renvoyait des erreurs qui étaient affichées;
La je n'ai aucun retour...

Je me demande si cela ne vient pas de la procédure stockée qui ne doit pas être appelé comme ca...Si ça se trouve je dois d'abord faire une première requête puis une seconde qui appelera uniquement la fonction mysql... non?
killgors est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 22h04   #8
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 551
Points : 2 551
Envoyer un message via Skype™ à rawsrc
Salut,

Il se peut que PDO ne sache pas gérer une syntaxe particulière mais généralement j'ai toujours récupéré une erreur. Sinon la remarque de Julp est pertinente, je pense qu'il va falloir abandonner le prepare().
Dès que c'est exotique, PDO ne suit plus trop.

Ce que tu peux essayer (aucune garantie) : convertir explicitement les type INT. Quand tu rattaches des PDO:ARAM_INT, multiplies les valeur par 1 :
Code :
$this->requetePrepareRecherche->bindValue(':competence1', $competencePrincipalRechercheParam * 1, PDO::PARAM_INT)
Je te rassure j'ai eu un problème similaire avec des formats comme ARRAY, HSTORE sur Postgres. Donc par analogie, la syntaxe de ton SQL avec IN - BETWEEN peuvent poser problème. Regardes mon post ici. Il n'y a rien de sorcier dans le formatage d'un tableau et pourtant PDO n'y est pas arrivé.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2011, 23h06   #9
Invité de passage
 
Inscription : janvier 2005
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 7
Points : 1
Points : 1
Envoyer un message via MSN à killgors
J'ai trouvé

Je vous donne la solution ca peut aider ^^ J'avais 2 problemes :

Le IN n'est pas géré par pdo comme disait julp, du coup il me mettait IN (1) et forcément j'avais rien qui correspondait en et en plus de ca j'avais une vulgaire faute de copier coller...j'avais mis 2 fois la même variable au niveau des dates du coup il faisait un between entre 2 dates identiques...

Je suis donc passé par des variables classique dans ma chaine, mais je perds en securite du coup...Enfin bon ca fonctionne c'est bien le principal :

Code :
1
2
3
4
5
6
7
8
9
10
11
$this->requetePrepareRecherche = $this->db->getConnexion()->prepare("SELECT tmp.id,get_distance_metres(:latitudePointCentral, :longitudePointCentral, tmp.latitude, tmp.longitude) distance ,COUNT(tmp.id) cpt  FROM  
					(
					select u.latitude, u.longitude, u.id from UTILISATEUR u inner join COMPETENCES c on u.id=c.id_utilisateur where c.id_metier IN (".$competencePrincipalRechercheParam.") and dateDeNaissance between :date_inf and :date_sup and derniere_connexion between :date_derniereConnexion_inf and :date_derniereConnexion_sup and is_active=1
					UNION ALL
					select u.latitude, u.longitude, u.id from UTILISATEUR u inner join COMPETENCES c on u.id=c.id_utilisateur where c.id_metier IN (".$competenceSecondaireRecherche1Param.") and dateDeNaissance between :date_inf and :date_sup and derniere_connexion between :date_derniereConnexion_inf and :date_derniereConnexion_sup and is_active=1
					UNION ALL
					select u.latitude, u.longitude, u.id from UTILISATEUR u inner join COMPETENCES c on u.id=c.id_utilisateur where c.id_metier IN (".$competenceSecondaireRecherche2Param.") and dateDeNaissance between :date_inf and :date_sup and derniere_connexion between :date_derniereConnexion_inf and :date_derniereConnexion_sup and is_active=1
					)tmp
group by tmp.id 
having distance < :distanceMax
order by cpt desc") ;

Merci à tous ceux qui m'ont aidé!!!
killgors est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h50.


 
 
 
 
Partenaires

Hébergement Web