Bonjour,

A la 33è mn de la vidéo, le header est renvoyé depuis la fonction e404 de la classe Controller. Mais cela provoque une erreur :
Warning : Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\www\Tuto\core\Model.php:56) in C:\xampp\htdocs\www\Tuto\core\Controller.php on line 74

La classe Controller.php :

"<?php

/**
 * Controller : Classe parente de tous les controllers.
 * 
 */

class Controller {

    public $request;
    private $vars       = array();
    public $layout      = 'default';
    private $rendered   = false;

    /**
     * Constructeur
     * @param $request Objet request de notre application
     **/
    function __construct($request) {
        $this->request = $request; //On stocke la variable dans l'instance
    }

    /**
     * Permet de rendre une vue
     * @param $view Fichier à rendre (chemin depuis view ou nom de la vue)
     **/
    public function render($view) {
        if ($this->rendered === true) {return false;}
        extract($this->vars);
        if(strpos($view, '/') === 0) {
            $view = ROOT.DS.'view'.DS.$view.'.php';
        }
        else {
            $view = ROOT.DS.'view'.DS.$this->request->controller.DS.$view.'.php';
        }

        ob_start();
        require $view;
        $content_for_layout = ob_get_clean();
        require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';
        $this->rendered = true;
    }

    /**
     * Permet de passer une ou plusieurs variables à la vue
     * @param $key Nom de la variable OU tableau de variables
     * @param $value Valeur de la variable
     **/
    public function set($key, $value = null) {
        if (is_array($key)) {
            $this->vars += $key;
        }
        else {
            $this->vars[$key] = $value;
        } 
    }

    /**
     * Permet de charger un modèle
     * @param $name Nom du modèle   
     */
    function loadModel($name) {
        $file = ROOT.DS.'model'.DS.$name.'.php';
        require_once $file;
        if(!isset($this->name)) {
            $this->$name = new $name();        
        }
    }

    /**
     * Permet de gérer les erreurs 404
     */
    function e404($message) {
        header("HTTP/1.1 404 Not Found");
        $this->set('message', $message);
        $this->render('/errors/404');
        die();
    }
}

?>
"

La classe Model.php :

"
<?php

class Model {

    static $connections = array();

    public $conf = 'default';
    public $table = false;
    public $db;

    public function __construct() {

        //Connection à la BDD
        $conf = Conf::$databases[$this->conf];
        if(isset(Model::$connections[$this->conf])) {
            $this->db = Model::$connections[$this->conf];
            return true;
        }
        try {
            $pdo = new PDO('mysql:host='.$conf['host'].';dbname='.$conf['name'].';'.$conf['login'],$conf['password']);
            Model::$connections[$this->conf] = $pdo;
            $this->db = $pdo;
        }
        catch(PDOException $e) {
            if (Conf::$debug >= 1) {
                die($e->getMessage());
            }
            else {
                die('Impossible de se connecter à la base de données');
            }
        }

        //Initialisation de qqs variables
        if($this->table === false) {
            $this->table = strtolower(get_class($this)).'s';
        }
    }

    public function find($req) {
        $sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' ';

        //Construction des conditions
        if(isset($req['conditions'])) {
            $sql .= 'WHERE '.$req['conditions'];
        }   
        $pre = $this->db->prepare($sql);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

    public function findFirst($req) {
        return current($this->find($req));
    }
}

?> 
"

3 réponses


catyoh
Auteur
Réponse acceptée

Finalement, la réponse était dans le Warning : il y avait un espace à la fin de Model.php, après le dernier ?>
Si ça peut aider quelqu'un...

Bonjour,
c'est pour cela qu'on ne met jamais "?>" à la fin d'un fichier php (si ce dernier se termine par du php

catyoh
Auteur

Merci Carouge. Le petit détail qui change tout...