Développer un site J3 - Problème header erreur 404 - Problème résolu

Par catyoh, il y a 4 ans


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, il y a 4 ans

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...

Carouge10, il y a 4 ans

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, il y a 4 ans

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