IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

pdo - requete prepare qui ne retourne rien [PDO]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 4
    Points
    4
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => 00000 [1] => [2] => )
    J'ai aussi printé toutes les valeurs passé en param :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    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é ?).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    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!

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    t'as activé la gestion des erreurs ?
    http://php.net/manual/fr/pdo.error-handling.php

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    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?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    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?

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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é.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é!!!

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

Discussions similaires

  1. Requete SQL qui ne retourne rien alors que ma table n est pas vide
    Par adelsunwind dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/06/2009, 19h16
  2. [PEAR][DB] Requête qui ne retourne rien
    Par xclam dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/05/2008, 13h58
  3. Requête qui ne retourne rien
    Par afrique dans le forum Administration
    Réponses: 4
    Dernier message: 02/10/2006, 18h19
  4. SELECT qui ne retourne rien à cause d'anti-slash
    Par mikyfpc dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2005, 23h04
  5. Requete OR qui ne ramene rien
    Par Sapience dans le forum Langage SQL
    Réponses: 10
    Dernier message: 14/04/2005, 12h12

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