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 :

Fatal error: Cannot use object of type PDOStatement as array [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Fatal error: Cannot use object of type PDOStatement as array
    Bonjour ! Un autre jour, et un nouveau soucis se dessine...

    Fatal error: Cannot use object of type PDOStatement as array in search.php on line 101.

    Le message d'erreur ne me dit rien et j'ai beau essayer les différentes techniques sur le web pour la retirer, impossible (ou dans le meilleur des cas j'obtiens juste un affichage vide).

    Voila le code qui pose problème :
    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
    17
    18
    19
    20
    21
     
    $sq1 = "SELECT modname, modlink, modpic, weight FROM mods WHERE $option LIKE '%$recherche%' ORDER BY idmod LIMIT ".(($cPage-1)*$perPage).",$perPage";
     
    $sq3 = "SELECT penname, penlink, nbpen FROM mods, pens, MtP WHERE mod_id = idmod AND pen_id = idpen AND $option LIKE '%$recherche%'";
    $requete = $bdd->query($sq1);
    $requete3 = $bdd->query($sq3);
                while ($recherche = $requete->fetch())
                    {
    echo "<table class=\"table table-striped table-bordered\"><tbody>";
                    print "<tr><td><b>$recherche[modname]</b></td>";
    				print "<td width=150 rowspan=\"4\" colspan=\"1\"><img src=\"$recherche[modpic]\" width=250 height=100</img><br/></td></tr>";
    				print "<tr><td><b>Material needed:</b><br>";
    				while ($requete2 = $requete3->fetch())
    					{
    					print "- $requete3->nbpen <a href=\"penmodding.com/pen.php?s=$requete3[penlink]\">$requete3[penname]</a><br>";
    					}
    				print "</td></tr>";
    				print "<tr><td><b>Weight class: </b>$recherche[weight]</td></tr>";
    				print "<tr><td><b>Tutorial Link: </b><a href=\"$recherche[modlink]\">$recherche[modname]</a></td></tr>";
        echo "</tbody></table><br>";
                    }
    La ligne concerné par l'erreur est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "- $requete3->nbpen <a href=\"pen.php?s=$requete3[penlink]\">$requete3[penname]</a><br>";
    Sur les différentes ressources que j'ai trouvé, le fait de mettre $variable->attribut, pouvait résoudre le soucis mais dans mon cas on obtiens un affichage vide (ma requête renvoie bien un résultat, c'est testé sur phpmyadmin)

    Pouvez vous me dire ce qui cloche et comment puis-je afficher ces variables svp ?


    Merci d'avance

  2. #2
    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 727
    Points
    10 727
    Par défaut
    c'est $requete2 qu'il faut mettre,
    arrange un peu ton code parce que y'a pleins de fautes

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup

    Plein de fautes, c'est à dire ? Je ne vois pas où (à part là où j'étais vraiment incapable ><)

  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 727
    Points
    10 727
    Par défaut
    • tes requêtes ne sont pas sécurisé
    • inutile de faire un while + fetch, fait direct un foreach
    • c'est echo ou print ?
    • on écrit plutôt du PHP dans du HTML et non l'inverse
    • tu fais $requete3->nbpen et après $requete3[penlink], t'es en object ou en array ?
    • il manque les quotes pour les cléfs d'array $requete3['penlink']
    • le HTML n'est pas valide


    je conseil de travaillé avec le niveau d'erreur maximal

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Mes requêtes j'ai mis ça pour les sécuriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $q = $_GET['q'];
    $recherche = addslashes( $q );
    $op = $_GET['op'];
    $option = addslashes ($op);
    C'est suffisant ?

    Pour le foreach,je me base sur cette page ?
    http://fr2.php.net/manual/en/control...es.foreach.php

    Pour echo et print, je dois dire que je n'ai jamais trouvé la différence car on me dit que c'est sensiblement la même chose

    PHP dans HTML : je vois ce que tu veux dire, et je vais donc faire des parcelles de code PHP dans le HTML

    Pour le object/array, c'était à cause de l'erreur (qui au final aurait du me sauter aux yeux), donc je suis plutôt en array (bonne réponse ?)

    Pour les quotes, je vais arranger ça.


    Je te remercie de tes conseils

    PS : le niveau d'erreur max, tu l'actives comment ? Merci

  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 727
    Points
    10 727
    Par défaut
    c'est quote pour PDO mais comme t'es en LIMIT faut faire un bindValue avec une requete prépare

    PDOStatement est du type Traversable, donc direct foreach ($requete as $recherche)Oui print et echo c'est presque la même chose, mais faut choisir, fait que echo ça suffira

    oui c'est en array, puisque fetch par defaut t'en revoie un

    pour le niveau max d'erreur, dans ton php.ini met la valeur de error_reporting a E_ALL | E_STRICT, ou au debut de ton code au final tu pourrais avoir un truc plus lisible genre

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php foreach ($requete as $recherche): ?>
     
    <table class="table table-striped table-bordered">
     
        <tr>
            <td><?php echo $recherche['modname'] ?></td>
            <td><img src="<?php echo $recherche['modpic'] ?>" width="250" height="100" />
        </tr>
     
        <tr>
            <td>Material needed
     
            <?php foreach ($requete3 as $requete2): ?>
     
                <?php echo $requete2['nbpen'] ?>
     
                <a href="penmodding.com/pen.php?s=<?php echo $requete2['penlink'] ?>">
                    <?php echo $requete2['penname'] ?>
                </a>
     
            <?php endforeach; ?>
     
            </td>
        </tr>
     
        <tr>
            <td>Weight class: <?php echo $recherche['weight'] ?></td>
        </tr>
     
        <tr>
            <td>Tutorial Link: <a href="<?php echo $recherche['modlink'] ?>"><?php echo $recherche['modname'] ?></a></td>
        </tr>
     
    </table>
     
    <?php endforeach; ?>

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Comme je suis en mutualisé, je n'ai pas accès au php.ini, je vais l'ajouter dans le fichier donc.

    Sinon oui le code est largement plus lisible et je m'y prenais encore comme une buse...

    Pour la sécurisation c'est suffisant ? Par contre, je crois que je vais devoir revoir quelque chose dedans car une requête avec un espace (q=+) sort toute ma base de données...

    Merci

  8. #8
    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 727
    Points
    10 727
    Par défaut
    c'est un type int donc ça devrai allé, mais fait attention ,

    si t'es en mutu faut changer ça dans ton htaccess (si c'est sous apache)
    mais c'est plutôt en développement local qu'il faut faire ça, tu développes pas direct du le distant ?

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Voilà je fais du distant (je n'ai pas toujours mon environnement de travail avec moi)

    Type int ? Normalement c'est du varchar que j'interroge no comprendo ^^


    Oui oui mutu sous Apache

  10. #10
    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 727
    Points
    10 727
    Par défaut
    coté PHP ton (($cPage-1)*$perPage) est du type int

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    D'accord, et ça qui bousille ma requête ?

  12. #12
    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 727
    Points
    10 727
    Par défaut
    Citation Envoyé par picool Voir le message
    D'acccccccord, et ça qui bousille ma requête ?
    la non,
    je t'invite a lire http://php.net/manual/fr/security.database.php

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Alors pour le int, je le gère de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(isset($_GET['p'])){
      $val=($_GET['p']<$nbPage?max($_GET['p'],0):$nbPage);
    }
    else
    {
    $cPage=1;
    }
    Et pour les deux autres $_GET, je n'utilise que du addslashes mais bon si j'arrive à bugger ma requête c'est que je m'y prend mal ^^

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

Discussions similaires

  1. Cannot use object of type SoapFault as array
    Par sajodia dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 01/08/2012, 12h46
  2. [ZF 1.10] Cannot use object of type stdClass as array
    Par cyrux dans le forum Zend Framework
    Réponses: 12
    Dernier message: 16/08/2010, 15h25
  3. [PHP 5.2] Fatal error: Cannot use object of type CPanier as array in . .
    Par Gauldo dans le forum Langage
    Réponses: 10
    Dernier message: 12/01/2009, 14h53
  4. Fatal error: Cannot use string offset as an array
    Par tremeur53 dans le forum Langage
    Réponses: 8
    Dernier message: 31/10/2008, 10h44
  5. Réponses: 4
    Dernier message: 14/02/2008, 21h41

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