Bonjour à tous,

Je suis actuellement en train de suivre le tutoriel de la POO et au chapitre 12 concernant la connexion à la base de donnée j'ai un problème.

Dans la classe Database lorsque l'on créé cette fonction

public function query($statement, $class_name) {
            $req = $this->getPDO()->query($statement);
            $datas = $req->fetchAll(PDO::FETCH_CLASS, $class_name);
            return $datas;
        }

On transmet en paramètre le $class_name donc comme évoqué dans le tutoriel je fais le code suivant

<?php foreach($db->query('SELECT * FROM wb_articles', 'App\Table\Article') AS $post): ?>

Je l'ai mis comme dans le tuto car je n'ai pas un dossier App mais un dossier classes plutôt. Et j'ai une erreur de classe introuvable dans mon Autoloader et sinon j'ai une classe introuvable dans mon Database.php si je passe en paramètre juste "Table\Article".

Y'a un truc que j'ai pas compris ou pas suivi mais je bloque...
Par ailleurs j'ai pas tout compris sur les namespaces et je n'en ai pas utilisé par rapport au tutoriel mais je ne pense pas que ça pose problème...

Si quelqu'un pouvait m'éclairer ce serait sympa, je vous remercie d'avance :)

Et au passage comme c'est mon premier message sur le forum je voulais remercier l'auteur pour ses tutoriels car je progresse beaucoup sur la POO grâce à ça ;)

9 réponses


serval154
Réponse acceptée

bonsoir,

essaies cela.

public function query($statement, $class_name)
{
    $req = $this->getPDO()->query($statement);
    $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
    $datas = $req->fetchAll();
    return $datas;
}

Bonjour,

Merci de ta réponse, effectivement il retrouve ma classe maintenant mais j'ai une erreur sur l'objet je vais essayer de trouver.
Je te remercie encore pour ton aide ;)

Bonjour,

N'hésites pas à demander, car j'ai suivi cette formation et c'est assez hard pour bien assimiler. J'ai du la visionner très souvent.
Mais c'est vrai, Johnatan est un vrai pro.

Bonne continuation

Bah en faite si je peux abuser, je comprends pas pourquoi je me retrouve avec un tableau maintenant.

<?php foreach($db->query('SELECT * FROM wb_articles', 'Table\Article') AS $post): ?>

        <h2><a href="index.php?p=post&id=<?php echo $post->id_article ?>"><?php echo $post->titre; ?></a></h2>

<?php endforeach; ?>

C'est mon appel pour récupérer mes articles en base de donnée, ce qui suit est ma fonction "query" :

public function query($statement, $class_name) {
            $req = $this->getPDO()->query($statement);
            $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
            $datas = $req->fetchAll();
            return $datas;
   }

J'ai appliqué ce que tu m'a donné et voici le retour avec un var_dump :

array (size=3)
  0 => 
    array (size=8)
      'id_article' => string '1' (length=1)
      0 => string '1' (length=1)
      'titre' => string 'Mon titre' (length=9)
      1 => string 'Mon titre' (length=9)
      'contenu' => string 'Hello les amis c'est moi !' (length=26)
      2 => string 'Hello les amis c'est moi !' (length=26)
      'date' => string '2015-12-12 14:18:23' (length=19)
      3 => string '2015-12-12 14:18:23' (length=19)
  1 => 
    array (size=8)
      'id_article' => string '2' (length=1)
      0 => string '2' (length=1)
      'titre' => string 'Mon titre 2' (length=11)
      1 => string 'Mon titre 2' (length=11)
      'contenu' => string 'Non c'est moi !' (length=15)
      2 => string 'Non c'est moi !' (length=15)
      'date' => string '2015-12-12 14:22:03' (length=19)
      3 => string '2015-12-12 14:22:03' (length=19)
  2 => 
    array (size=8)
      'id_article' => string '3' (length=1)
      0 => string '3' (length=1)
      'titre' => string 'Mon titre 3' (length=11)
      1 => string 'Mon titre 3' (length=11)
      'contenu' => string 'D�sol� les enfants c'est moi !' (length=30)
      2 => string 'D�sol� les enfants c'est moi !' (length=30)
      'date' => string '2015-12-12 14:22:09' (length=19)
      3 => string '2015-12-12 14:22:09' (length=19)

Suivi d'une erreur que je comprends pas trop

Notice: Trying to get property of non-object in C:\wamp\www\poo_working\pages\home.php on line 3 Call Stack #TimeMemoryFunctionLocation 10.0013250912{main}( )..\index.php:0 20.0031290040require( 'C:\wamp\www\poo_working\pages\home.php' )..\index.php:27 ">

En tout cas je te remercie de ton aide ;)

Hello,

Les éléments que tu essaies d'appeller ne sont pas des propriétés mais des index de ton tableau.

Essaies celà :

<?php foreach($db->query('SELECT * FROM wb_articles', 'Table\Article') AS $post): ?>

        <h2><a href="index.php?p=post&id=<?php echo $post['id_article']; ?>"><?php echo $post['titre']; ?></a></h2>

<?php endforeach; ?>

Cette fois il me retourne seulement mon premier élément.
La question est pourquoi cela me retourne un tableau ?

Dans le tuto c'est toujours un objet et on appelle les propriétés avec -> et donc moi j'ai un tableau en retour c'est pas normal ?
Merci encore pour votre aide

Bonjour,

Désolé de te répondre tardivement, maisje vis en Nouvelle-Calédonie et nous avons 10 h 00 d'avance sur la métropole.

J'ai déjà décelé une petite erreur dans ton code. Tu as oublié le point-virgule après l' instruction $post->id_article
Mais je ne pense pas que cela vienne de là puisque le point-virgule n'est pas obligatoire en dernière instruction dans une balise php.
Il faut quand s'habituer à les mettre systématiquement.

<?php foreach($db->query('SELECT * FROM wb_articles', 'Table\Article') AS $post): ?>

    <h2><a href="index.php?p=post&id=<?php echo $post->id_article; ?>"><?php echo $post->titre; ?></a></h2>

<?php endforeach; ?>

Plutôt que d'écrire <?php echo $post->id_article; ?>, utilise le raccourci pour le <?php echo, remplaces le par <?=, c'est plus simple et cela rend plus lisible ton code. Prends l'habitude de construire l'encadrement du code php avant d'écrire tes instructions, comme ceci:
1 - je pose les balises php : <?= ; ?>
2 - ensuite j'inscrit le code à l'intérieur, cela évite les oublies de syntaxe : <?= $post->id_article ; ?>

Ton erreur vient du fait que tu n'utilises pas les namespaces et que ton fichier Autoloader est dans un namespace App.
De plus ce dernier dans sa méthode autoload traite la directive NAMESPACE. si tu as reproduit tel quel l'autoloader comme Johnatan l'explique.

Ton problème doit venir de là, car si tu as des classes dans un dossier app, et d'autres dans un dossier Table l'autoloader ne sait plus où charger les classes.

Les namespaces, c'est assez simple. regardes encore et encore la vidéo traitant le sujet et fais des essais dans un autre dossier qui ne traiterais que de cela.

Sinon sans ton architecture, je ne pourrai pas t'aider.

Bye

Bonjour,

Essaie ceci,

ta requête:

<?php foreach($db->query('SELECT * FROM wb_articles', 'Table\Article') as $post): ?>

    <h2><a href="index.php?p=post&id=<?= $post->id_article ; ?>"><?= $post->titre; ?></a></h2>

<?php endforeach; ?>

la méthode de Database :

public function query($statement,$class_name, $one = false){
$req = $this->getPDO()->query($statement);
$req->setFetchMode(PDO::FETCH_CLASS, $class_name);
if($one){
$datas = $req->fetch();
} else {
$datas = $req->fetchAll();
}
return $datas;
}

l'argument $one étant a false ce qui veut dire que tu récupères plus d'un enregistrement.
Johnatan démontre cela dans son cours vidéo.

Merci beaucoup pour ton aide, je vais aller revoir les explications sur les namespaces et refaire tout ça, ce sera sans doute plus simple.
Je reviens poster une fois que j'aurais fait tout ça ;)

Encore merci