Bonjour à tous et à toutes,
je rencontre un problème avec mon code à la fin du TP : Connexion à la base de donnée, cela fait une bonne demi-journée que je suis dessus et je ne trouve toujours pas mon erreur.

Voici mon code dans le fichier database.php :

<?php
namespace App;
use \PDO;
class Database {
        private $db_name;
        private $db_user;
        private $db_pass;
        private $db_host;
        private $pdo;
             public function __construct($db_name, $db_user = 'root', $db_pass = '', $db_host = 'localhost' )
                  {
                      $this->db_name = $db_name;
                      $this->db_user = $db_user;
                      $this->db_pass = $db_pass;
                      $this->db_host = $db_host;
                  }
             private function getPDO(){
                 if ($this-> pdo === null) {
                     $pdo = new PDO('mysql:dbname=blog;host=localhost', 'root', '');
                     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                     $this->pdo = $pdo;
                 }
                 return $this->pdo;
             }

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

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

            }
}

Dans mon fichier single.php :

<?php
$post = $db->prepare('SELECT * FROM article WHERE id= ?', [$_GET['id']], 'App\Table\Article', true);
?>

<h1><?= $post->titre; ?></h1>

<p><?= $post->contenu; ?></p>

Dans mon fichier article.php

<?php
namespace App\Table;
class Article {
    public function __get($key){
        $method = 'get' . ucfirst($key);
        $this->$key = $this->$method();
        return $this->$key;
    }
    public function getUrl(){
        return 'index.php?p=article&id' . $this->id;
    }

    public function getExtrait(){
        $html = '<p>'. substr($this->contenu,0, 150).'...</p>';
        $html .= '<p><a href="'.$this->getUrl().'">Voir la suite</a></p>';
        return $html;
    }
}

Pour finir j'ai trois erreurs :
https://drive.google.com/file/d/0B33fxm0r0DabNTRkVDN4NnJWQVU/view?usp=sharing

Merci de bien vouloir m'aider :)

5 réponses


SLK
Réponse acceptée

Salut,

Tu as peut être un soucis avec ta méthode getPDO.

Il me semble qu'il n'y a pas d'erreur.

En es-tu certain de ton "use \PDO" ? ça serait pas plutôt "use PDO" ?

Il faut bien utiliser \PDO, c'est pour "sortir" du namespace "App", et utiliser le "PDO" de PHP.
Si on enlève l'antislash, on essaie d'utiliser le PDO qui est dans le namespace "App" (et ce PDO là n'existe pas).

Hello j'ai souvent l'erreur trying to get property on non object...
et cela correspond à un appel en base de donnée d'un champ ou d'une table qui n'existe pas.

Je ne pense pas, ça veut dire qu'on essaie d'accéder à une propriété (attribut) sur quelque chose qui n'est PAS un objet.
Ici, on fait : $post->titre; alors que $post n'est pas un objet.

Pour finir j'ai trois erreurs :
https://drive.google.com/file/d/0B33fxm0r0DabNTRkVDN4NnJWQVU/view?usp=sharing

La première erreur, "undefined index" à la ligne 2 :

$post = $db->prepare('SELECT * FROM article WHERE id= ?', [$_GET['id']], 'App\Table\Article', true);

A mon avis, la clé 'id' n'existe pas : $GET_['id'] n'existe pas, vérifies que tu créer bien cette clé (en GET).

J'imagine que les 2 autres érreurs découlent de la 1ère.
Vérifies $_GET['id'] et dis nous ce qu'il en est.

Bonjour,

Tu as peut être un soucis avec ta méthode getPDO. Essais cette syntaxe pour new PDO(...)
private function getPDO(){
if($this->pdo === null){
$pdo = new PDO("mysql:dbname={$this->db_name};host={$this->db_host};charset=utf8", $this->db_user, $this->db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$this->pdo = $pdo;
}
return $this->pdo;
}

En es-tu certain de ton "use \PDO" ? ça serait pas plutôt "use PDO" ?
lol je dis ça je dis rien.
Sinon as-tu essayé de faire un die() ou *var_dump() * de toute tes méthodes pour voir ou se situe l'erreur (false, ....) ?

Hello j'ai souvent l'erreur trying to get property on non object...

et cela correspond à un appel en base de donnée d'un champ ou d'une table qui n'existe pas.

pour ta première erreur concernant l'id qui n'est pas définit, je comprend que tu n'as pas de paramètre "id" dans ton url.

Après je suis loin d'être un expert, passer une demie journée pour trouver mes erreurs est ma spécialité :)

ou peut être l'espace entre $this-> et pdo dans la fonction getPDO de ta class database.

Fatavis
Auteur

Merci à tous,
t'as raison SLK, j'ai fait une erreur dans l'url, j'avais oublié un "="dans l'url, je me sens trop bête !