Bonjour,
Je suis la formation POO de grafikart à la partie création du blog les Tables et je rencontre un soucis
j'ai modifié ma home comme ceci pour afficher les catégories à droite:
<div class="row">
<div class="col-sm-8">
<?php foreach (\App\Table\Article::getLast() as $post): ?>
<h2><a href="<?= $post->url; ?>"><?= $post->titre; ?></a></h2>
<p><em><?= $post->categorie; ?></em></p>
<p><?= $post->extrait; ?></p>
<?php endforeach; ?>
</div>
<div class="col-sm-4">
<ul>
<?php foreach (\App\Table\Categorie::all() as $categorie): ?>
<li><a href="<?= $categorie->url; ?>"><?= $categorie->titre; ?></a></li>
<?php endforeach; ?>
</ul>
</div>
</div>
j'ai donc créé une class Categorie que voici:
<?php
namespace App\Table;
use App\App;
class Categorie {
private static $table = 'categories';
public static function all() {
return App::getDb()->query("
SELECT *
FROM " . self::$table . "
", __CLASS__);
}
}
Mais je rencontre les erreurs suivantes:
Notice: Undefined variable: pdo in C:\wamp64\www\blog\app\Database.php on line 28
Fatal error: Call to a member function query() on null in C:\wamp64\www\blog\app\Database.php on line 32
oui pas de soucis mais je ne pense pas que cela vienne de là car si j'enlève l'affichage des catégories dans mon home je n'ai plus d'erreurs.
<?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 $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;
}
}
C'est return $this->pdo dans getPDO car la quand il est rempli, il ne passe pas dans le if donc $pdo est null.
effectivement si j'enlève le if ça fonctionne mais ce que je comprend pas c'est que je n'ai pas ce problème avec la class Article que voici:
<?php
namespace App\Table;
use App\App;
class Article {
public static function getLast() {
return App::getDb()->query(
"SELECT articles.id,articles.titre,articles.contenu,categories.titre as categorie
FROM articles
LEFT JOIN categories
ON category_id = categories.id
", __CLASS__);
}
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, 100) . '...</p>';
$html .= '<p><a href="' . $this->getURL() . '">Voir la suite</a></p>';
return $html;
}
}
Lors du 1er appel, tout va bien puisque tu rentres dans le if, se sont les apel suivant qui posent problème
j'ai du me planter à quelque part ou j'ai pas tout suivi car j'ai aussi la class App pour la connection à la base de donnée:
<?php
namespace App;
class App {
const DB_NAME = 'blog';
const DB_USER = 'root';
const DB_PASS = '';
const DB_HOST = 'localhost';
private static $database;
public static function getDb() {
if (self::$database === null) {
self::$database = new Database(self::DB_NAME, self::DB_USER, self::DB_PASS, self::DB_HOST);
}
return self::$database;
}
}
@Carouge10 j'avais mal lu ta 1ere réponse en fait
par contre ce que je comprend pas c'est l'utilité de la class App car elle ne me semble pas être prise en compte enfin du moins les constantes puisque même si je les modifies je n'ai pas d'erreurs sur la connection MySql