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 :

Exécution d'une requête impossible sur un PDO [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Exécution d'une requête impossible sur un PDO
    Bonjour,

    Dans le cadre d'un stage, je développe actuellement un indicateur qui doit compter le nombre de connexions effectuées par chaque équipe. Toutes les connexions sont enregistrées dans une table "tracesforms" qui comporte l'identifiant d'un membre du personnel.

    J'effectue une première requête qui me permet de rattacher chaque identifiant à une équipe, puis effectue un décompte selon certains paramètres (equipe et cd_forms).

    Voici le code (mis en forme pour mieux comprendre) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $requete4 = $bdd -> query(
    "SELECT COUNT(*) AS resultat4 
    FROM (
    <div style="margin-left:40px">SELECT equipe, cd_forms 
    FROM vf_equipe, tracesforms 
    WHERE cd_usr=controleur 
    UNION
    (SELECT famille_equipe, cd_forms
    FROM vf_famille_equipe, tracesforms 
    WHERE cd_usr=gestionnaire)) AS test</div>WHERE equipe='".$requete3['equipe']."'
    AND cd_forms='".$numeroEcranChoisi."'");
    $resultat4 = $requete4 -> fetch();
    L'exécution me donne l'erreur suivante pour la première ligne :
    Fatal error: Cannot use object of type PDOStatement as array in C:\Program Files (x86)\wamp\www\CODE_INDICATEUR_RATP\indicateur\vue_ecran.php on line 73
    $bdd est un new PDO(avec connexion à la base)

    J'ai déjà utilisé cette méthode plusieurs fois et fonctionne parfaitement mais je ne comprends pas du tout cette erreur là. Est-ce liée au fait que je fasse un SELECT... FROM (SELECT...) ? Comment puis-je faire autrement ? Étrangement, lorsque je teste cette requête directement sur ma BDD (via phpMyAdmin), j'obtiens bien le résultat que j'attends.

    Merci de m'aider !

  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 777
    Points
    17 777
    Par défaut
    Il faudrait bien interpréter le message d'erreur : il dit que vous tentez d'utiliser un objet PDOStatement comme un tableau. Or c'est tout bonnement impossible (du moins à la base - si vous voulez surcharger PDOStatement pour qu'elle implémente ArrayAccess c'est votre problème) : vous avez certainement oublier un fetch* au niveau de la précédente requête ($requete3).
    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
    $resultat3 = $requete3->fetch(/*PDO::FETCH_ASSOC*/);
    $requete4 = $bdd -> query(
    "SELECT COUNT(*) AS resultat4
    FROM (
    
        SELECT equipe, cd_forms
        FROM vf_equipe, tracesforms
        WHERE cd_usr=controleur
        UNION
        (SELECT famille_equipe, cd_forms
        FROM vf_famille_equipe, tracesforms
        WHERE cd_usr=gestionnaire)) AS test
    
    WHERE equipe='".$resultat3['equipe']."'
    AND cd_forms='".$numeroEcranChoisi."'");
    $resultat4 = $requete4 -> fetch();
    Et je ne vois pas l'intérêt d'utiliser PDO si c'est pour écrire des horreurs pareilles (aucun échappement, injection sur $numeroEcranChoisi ?).

  3. #3
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Et il y a quoi à la ligne 73 ?

  4. #4
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    @ julp: Je ne vois pas pourquoi tu parles "d'horreur pareille" sous pretexte que tu ne voies pas d'échappement sur une variable passée en requête.

    J'aimerais juste rappeler que ce n'est pas l'objet de son post, et si ce monsieur fait comme moi, c'est normal que tu ne puisses pas voir en plein milieu de code de traitement si une regex (ou autre) à été faite sur la variable ou pas avant le traitement des données donc.

  5. #5
    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 777
    Points
    17 777
    Par défaut
    Citation Envoyé par tse_jc Voir le message
    Je ne vois pas pourquoi tu parles "d'horreur pareille" sous pretexte que tu ne voies pas d'échappement sur une variable passée en requête.

    J'aimerais juste rappeler que ce n'est pas l'objet de son post, et si ce monsieur fait comme moi, c'est normal que tu ne puisses pas voir en plein milieu de code de traitement si une regex (ou autre) à été faite sur la variable ou pas avant le traitement des données donc.
    D'une : ça aurait été fait, il n'aurait pas CE message d'erreur.

    De deux : que se passe t-il si ce qu'il cherche à introduire contient une ' ? Et pour l'injection, ce n'était pas une affirmation mais bien une question. (d'autant qu'elles sont "bindées" comme des chaînes).

    Après, j'ai peut être tendance à voir le pire mais ça ne fait pas de mal, disons.

  6. #6
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    à Julp: "Après, j'ai peut être tendance à voir le pire mais ça ne fait pas de mal, disons." Allez, je te l'accorde.

    Par contre l'erreur ne viens pas de là. Si on devait prendre des paris, je dirais par expérience que son erreur viens d'un endroit de code qui se place après ce qu'il nous à montré et dans lequel pour sortir les données il a fait un foreach à partir du PDOstatement d'où l'erreur.

    Allez vincevince7, dis nous tout

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Le problème venait bien effectivement d'un oubli de fetch...
    Merci en tout cas de vous être attardés sur mon problème même si au final je suis passé par une toute autre requête pour obtenir ce dont j'avais besoin.

    Je m'excuse en tout cas pour ces "horreurs pareilles" mais le seul tutoriel proposé sur internet un tant soit peu compréhensible pour un novice utilise la méthode des PDO pour accéder à une BDD MySQL via PhP. Est-ce la seule ? la meilleure ? la mieux adaptée à mon utilisation ? Aucune idée !

    D'ailleurs, je ne comprends même pas les termes d'"échappement", "injection" ou "bindées"... De là à appliquer ces principes/méthodes...

    Pour répondre à la question du "Que se cache-t-il derrière $numeroEcranChoisi ?", il s'agit d'une valeur renseignée par une liste déroulante située dans un formulaire, donc a priori je n'ai pas fait de contrôle sur cette variable.

    Au fait bravo les cours PHP

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/04/2010, 19h27
  2. [C#][SQLServer]Résultat d'exécution d'une requête sur SQLServer
    Par Chakalaka dans le forum Accès aux données
    Réponses: 1
    Dernier message: 14/04/2010, 12h32
  3. Réponses: 6
    Dernier message: 18/11/2007, 17h09
  4. Réponses: 6
    Dernier message: 29/06/2007, 17h25

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