Bonjour,

Voila je rencontre un petit problème avec le code source de Model View Controller

Ce que je fais

Je télécharge le code souce,
je créer les tables,
je modifie le code source pour que les tables soiuent prises en compte

Ce que je veux

faire fonctionner l'exemple donné

Ce que j'obtiens

Administrer les articles
Ajouter

Notice: Undefined variable: posts in /Applications/MAMP/htdocs/Model-View-Controller/app/Views/admin/posts/index.php on line 16

Warning: Invalid argument supplied for foreach() in /Applications/MAMP/htdocs/Model-View-Controller/app/Views/admin/posts/index.php on line 16
ID Titre Actions

12 réponses


Peux-tu montrer le code ?
La structure de ta bdd ?
Merci

Bonsoir.

Notice: Undefined variable: posts in /Applications/MAMP/htdocs/Model-View-Controller/app/Views/admin/posts/index.php on line 16

L'erreur est plutôt explicite, la variable posts n'est pas définie et donc la seconde erreur est plutôt évidente.
Il te faut donc vérifier quel nom porte la variable dans laquelle sont stockés les enregistrements récupérées via la base de données.
Sinon, comme le dit Mehdikacim, montres nous le code et plus précisément à partir de la récupération des données.

C'est le code source telechargé de Model View Controller de La POO en PHP chapitre Design Patterns Avancés.
J'ai juste mis mon dbname

public function __construct($db_name = 'mysql:dbname=grafikart;localhost', $db_user = 'root', $db_pass = 'root', $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=grafikart;localhost' . $this->db_name . ';host=' . $this->db_host, $this->db_user, $this->db_pass);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo = $pdo;

Ce n'est pas ce code là qui va nous aider.
Montres nous la partie dans laquelle tu récupères les enregistrements en base de données, soit normalement l'action index de ta classe PostsController qui se trouve dans le dossier Admin.
Par contre, si tu n'as aucun enregistrement dans la table posts dans ta base de données, il est possible que ce soit dû à ça, tu devrais donc faire la vérification dans l'action du controller, ne transmettre la variable à la vue que si tu as un retour de résultats puis dans la vue, si la variable $posts n'est pas définie, tu ne fais pas le foreach.

Voila le code
class PostsController extends AppController{

public function __construct(){
    parent::__construct();
    $this->loadModel('Post');
    $this->loadModel('Category');

}

public function index(){
    $posts = $this->Post->last();
    $categories = $this->Category->all();
    $this->render('posts.index', compact('posts', 'categories'));
}

public function category(){
    $categorie = $this->Category->find($_GET['id']);
    if($categorie === false){
        $this->notFound();
    }
    $articles = $this->Post->lastByCategory($_GET['id']);
    $categories = $this->Category->all();
    $this->render('posts.category', compact('articles', 'categories', 'categorie'));
}

public function show(){
    $article = $this->Post->findWithCategory($_GET['id']);
    $this->render('posts.show', compact('article'));
}

}

hello
déjà : est ce que tu te connectes bien à ta db ? c koi ce ';localhost' ds ton db_name ?
ensuite, ce n'est pas du php de débutant ;) c une syntaxe qui ressemble bcp à laravel, du moins avec bcp d'appel de class d'un framework...
c koi ton contexte ?

Salut,

Dans la méthode getPDO(), tu concatènes $this->db_name avec 'mysql:dbname=grafikart;localhost', ce qui fait que si tu précises la valeur de $db_name à l'instanciation de la classe, tu auras un paramètre de connexion erroné. Du coup tu ne pourras pas récupérer de nouvelle instance de PDO.
Est-ce que tu as compris ce que tu as écris ou tu as juste recopié bêtement ?

Salut,
Merci @betaweb, j' ai vu ou il faut que j'initialise la bdd, j' ai corrigé et init le code suivant dans config.php :
<?php
return array(
"db_user" => "root",
"db_pass" => "root",
"db_host" => "localhost",
"db_name" => "grafikart"
);
Pour répondre à ta question c'est sur les conseils de mon enseignant que j'ai repris ce code .
Mais j'ai toujours la même erreur.

tu as corrigé ta connection getPDO ?

Donc c'est que tu ne comprends pas ce que tu fais.
Quelle version de PHP utilises-tu ?
Peux-tu nous montrer la méthode loadModel() ?
Fais aussi un var_dump de la variable $posts dans ton posts/index.php et colle nous le résultat.
Vérifies aussi la casse de tes tables et de tes noms de classes.

public function __construct($db_name, $db_user = 'root', $db_pass = 'root', $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=' . $this->db_name . ';host=' . $this->db_host, $this->db_user, $this->db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo = $pdo;
}
return $this->pdo;
}
Version php 7.0.12

<?php

namespace App\Controller;

use Core\Controller\Controller;
use \App;

class AppController extends Controller{

protected  $template = 'default';

public function __construct(){
    $this->viewPath = ROOT . '/app/Views/';
}

protected function loadModel($model_name){
    $this->$model_name = App::getInstance()->getTable($model_name);
}

}

Notice: Undefined variable: posts in /Applications/MAMP/htdocs/Model-View-Controller/app/Views/posts/index.php on line 3
NULL

Et la méthode last() retourne bien un objet ? Tu as 'var_dumpé' tes variables ?