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 :

Requête préparée et non préparée [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut Requête préparée et non préparée
    Bonjour,

    Mon problème est le suivant, je prépare une requête ci-dessous mais un problème lors de l'exécution apparait. Je fais afficher la requête pour la tester via une interface graphique (heidisql).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT valeur FROM ma_table WHERE col = 2 AND date = '2015-04-14 10:25:00'
    requête préparée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = $bdd->prepare('SELECT valeur FROM :tab WHERE col = :idInd AND date = :time');
    Je rentre la requête dans heidisql, ça ne marche pas.

    Je teste ensuite le premier tronçon : SELECT valeur FROM ma_table WHERE c1 = 2 ==> Ca marche.

    Je rajoute ensuite le champ date, ça ne marche plus.
    Si je remplis le champ date via une valeur contenu dans ma_table, la requête fonctionne.
    --> Avec bien sûr la même ligne, mêmes espaces (même si ça change pas grand chose), mêmes valeurs, mêmes quotes etc

    Message d'erreur :
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''ma_table' WHERE col = '1090' AND date = '2015-04-' at line 1' in gen_alarme_model.php:177 Stack trace: #0 gen_alarme_model.php(177): PDOStatement->execute(Array) #1 listeeq_controller.php(112): gen_alarme_model->getAllValeurInd(Array, 'GGSN', Array) #2 [internal function]: listeeq_controller->Ggsn('') #3 index.php(33): call_user_func_array(Array, Array) #4 {main} thrown in gen_alarme_model.php on line 177
    Avec ligne 177 étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req->execute([':tab' => $tab, ':idInd' => $listIdInd[$nbInd],':time' => $tabDate[1]]);
    Avez-vous une idée du pourquoi du comment ça ne marche pas ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je crois que je ne comprendrai jamais l'intérêt de masquer le nom de la table interrogée par une variable PHP !
    En principe, une requête qui s'applique sur une table a peu de chance de fonctionner sur une autre table parce que leurs structures sont différentes, non ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut
    En effet, tu as raison cependant, ça ne résout toujours pas le problème initial ! Mais j'en prends note.

    J'ai une autre question en relation avec le problème initial. Admettons que dans col (qui est censé prendre des entiers) je rentre une '*' est ce que la requête renvoie quand même un résultat ?

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''ma_table' WHERE col = '1090'
    Ce message d'erreur de MySQL signifie qu'il y a une erreur juste avant l'extrait de requête donné.

    Je ne sais plus comment on fait mais je crois qu'il y a un moyen d'afficher la requête réellement envoyée par PDO à MySQL. Ça t'aidera sans doute à trouver la cause de l'erreur.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 131
    Par défaut
    bonjour,

    c'est pas possible de passer le nom de la table te les noms de colonnes en paramètre

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Le nom de la table ne peut pas être mis en paramètre.

    * n'a pas de signification dans une condition WHERE.
    Tu peux gérer le cas via PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql = 'SELECT valeur FROM tatable WHERE date = :time';
     
    if ($listIdInd[$nbInd] !== "*") {
         $sql .= ' AND col = :idInd';
         $param[':idInd'] =  $listIdInd[$nbInd];
    }
    $param[':time'] => $tabDate[1];
     
    $req = $bdd->prepare($sql);
    $req->execute($param);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Au passage, j'espère que ta colonne ne s'appelle réellement "date"...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut
    Merci pour vos réponses ! En affichant les requêtes j'ai réussis à régler mon problème !

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

Discussions similaires

  1. [PDO] conversion d'une requête non préparée en requête préparée
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/01/2015, 18h18
  2. Requête avec paramètre non défini à l'avance
    Par The_Super_Steph dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/06/2007, 09h46
  3. Requête : Affichage champs non vides
    Par emilie31 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 13/02/2007, 11h01
  4. [MySQL]Sous - Requêtes compatible ou non compatible
    Par costadelo dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/12/2006, 12h33
  5. Requête suppression sur non concordance
    Par curt dans le forum Access
    Réponses: 4
    Dernier message: 30/05/2006, 19h32

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