Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher une requete préparée PDO

Sujet résolu
15 novembre 2013 à 15:08:40

Bonjour! 

:D

Je souhaite afficher une requete préparée avec valeurs bindées dont voici le code :

// Retourne la liste de tous les cours d'une classe sur une période
  public function getPeriod($loId, $heureDebut, $heureFin) {

    var_dump($loId, $heureDebut, $heureFin);

    $cours = array();

    $q = $this->_db->prepare('SELECT * FROM cours WHERE lo_id = :lo_id AND cr_heure_debut >= :cr_heure_debut AND cr_heure_fin <= :cr_heure_fin');

    // Assignation des valeurs à  la requête.
    $q->bindValue(':cr_heure_debut', $heureDebut, PDO::PARAM_STR);
    $q->bindValue(':cr_heure_fin', $heureFin, PDO::PARAM_STR);
    $q->bindValue(':lo_id', $loId, PDO::PARAM_INT);

    var_dump($q->queryString);
    // Exécution de la requête
    try {
      $q->execute();
      $q->debugDumpParams();
    } catch (PDOException $e) {
      echo 'Erreur : ' . $e->getMessage() . '<br />';
      echo 'N° : ' . $e->getCode();
    }

    while ($donnees = $q->fetch(PDO::FETCH_ASSOC)) {
      $cours[] = new Cours($donnees);
    }
  }

j'ai essayé de l'afficher avec : (que j'ai bien-sûr mis après)

    var_dump($q->queryString);

Seulement le bougre m'affiche : 

<small>string</small>'SELECT * FROM cours WHERE lo_id = :lo_id AND cr_heure_debut >= :cr_heure_debut AND cr_heure_fin <= :cr_heure_fin'(length=112)


Je voudrais bien voir la même requête avec les valeurs bindées afin de voir si elles passent bien.

Donc si quelqu'un sait comment on fait ça je voudrais bien un petit coup de pouce.

Merci. ;)

-
Edité par Kearny 15 novembre 2013 à 15:28:19

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2013 à 15:13:59

Petite précision, j'ai tapé à la mano la requête dans HeidiSQL pour m'assurer qu'elle fonctionne et c'est bien le cas.
  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2013 à 15:22:09

MErci beaucoup !

Il me dit ça :

[112] SELECT * FROM cours WHERE lo_id = :lo_id AND cr_heure_debut >= :cr_heure_debut AND cr_heure_fin <= :cr_heure_fin Params: 3 Key: Name: [15] :cr_heure_debut paramno=1 name=[15] ":cr_heure_debut" is_param=1 param_type=2 Key: Name: [13] :cr_heure_fin paramno=2 name=[13] ":cr_heure_fin" is_param=1 param_type=2 Key: Name: [6] :lo_id paramno=0 name=[6] ":lo_id" is_param=1 param_type=1

Donc je suppose que mon bind ne marche pas, je ne comprends pas pourquoi par contre... 

Une idée?

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2013 à 15:24:19

Je voudrais bien voir la même requête avec les valeurs bindées afin de voir si elles passent bien.

Pas possible. Si tu le veux vraiment c'est côté serveur qu'il faut récupérer la requête exécutée, via :

  • les logs du serveur
  • son profiler (MySQL)

Etant donné le fonctionnement d'une vraie requête préparée, c'est normal et logique d'ailleurs (le client ne génère pas de SQL, il ne fait que transmettre les valeurs des paramètres pour la requête - déjà - préparée).

L'opération de bind, de manière générale, c'est juste l'association d'une valeur à un paramètre pour une requête préparée donnée. Ca ne fait rien de visible. D'autant qu'en PHP, il me semble que la véritable opération de bind n'a lieu qu'au moment du execute. Les méthodes bind* ne font qu'associer (indirectement) une valeur à un marqueur en mémoire.

PS : note qu'il manque l'"execute" à ton extrait de code

-
Edité par julp 15 novembre 2013 à 15:32:10

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2013 à 15:30:45

Erf, merci.:euh:

Du coup je ne sais pas comment faire pour récupérer la requête côté serv.

Je peux sûrement avec HeidiSQL, je vais faire des recherches là dessus.

Merci pour la piste et au passage j'ai mis à jour mon premier post en écrivant l'intégralité de la méthode de mon manager de façon à avoir le excute().;)

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2013 à 15:46:38

Excuse moi. Je pensais que la fonction que je t'ai indiqué donnais la valeur bindée de chaque paramètre de ta requête. Je me suis trompé. Dsl pour la fausse piste.

  • Partager sur Facebook
  • Partager sur Twitter
13 juin 2021 à 18:46:56

@SarahSarah54 Bonsoir, merci de ne pas déterrer d'ancien sujet résolu, surtout pour ne rien en dire.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter