Bonjour, la préoccupation que je soumets a déjà été soumise il a deux années sur le forum mais n'a pas eu de réponse. J'espère avoir plus de chance que mon pédecesseur.

Voila je rencontre un petit problème avec mon code. J'ai utilisé de l'orienté objet pour gérer un espace membre comme dans le tutoriel qui a été réalisé pour ça. Néanmoins une erreur m'apparaît.

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /storage/ssd2/641/6099641/public_html/include/header.php:1) in /storage/ssd2/641/6099641/public_html/class/Session.php on line 14

Il n'y a qu'un session_start() et il se situe dqns le constructeur de ma classe Session.

12 réponses


Balsakup
Réponse acceptée

Comme l'as dit @Huggy l'instance de Session est fait en plein millieu du HTML (contenu HTML déjà envoyé au navigateur).
L'instance de Session devrait se faire tout en haut de la page, avant l'HTML.

Utilise plutôt cette sémantique là.

<?php $flashHelper = Session::getInstances(); >

// Ton contenu HTML

<?php if($flashHelper->hasFlashes()): ?>
  <?php foreach ($flashHelper->getFlashes() as $type => $message): ?>
    <div class="alert alert-<?= $type; ?>">
        <?= $message; ?>
    </div>
  <?php endforeach ?>
<?php endif; ?>
Bernès
Auteur

Ma classe Session

<?php 
    class Session
    {
                     static $instance;

            static function getInstances(){
                if(!self::$instance){
                    self::$instance = new Session();
                }
                return self::$instance;
            }

            public function __construct(){
                session_start();
            }

            public function setFlash($key, $message){
                $_SESSION['flash'][$key] = $message;
            }

            public function hasFlashes(){
                return isset($_SESSION['flash']);
            }

            public function getFlashes(){
                $flash = $_SESSION['flash'];
                unset($_SESSION['flash']);
                return $flash;
            }

            public function write($key, $value){
                $_SESSION[$key] = $value;
            }

            public function read($key){
                return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
            }

            public function delete($key){
                unset($_SESSION[$key]);
            }
  }

Bonsoir.
Tu pourrais aussi nous montrer le début de ton fichier header.php, étant donné que le problème semble venir de là et si possible, le fichier qui fait appel au fichier que j'ai nommé ci-dessus.

Bernès
Auteur
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title><?=$nomDeMapage;?></title>
        <link rel="stylesheet" href="public/css/bootstrap.css">
        <link rel="stylesheet" href="public/css/style.css">

    </head>
    <body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark navbar_shrink">
  <a class="navbar-brand" href="index.php">Navbar</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="true" aria-label="Toggle navigation" style="">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="navbar-collapse collapse show" id="navbarColor01">
      <ul class="navbar-nav"  style="margin: auto;">
      <li class="nav-item active ">
        <a class="nav-link" href="index.php">Accueil <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#"></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="register.php">Envoyer votre Profil</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">A propos</a>
      </li>
    </ul>

  </div>
</nav>

      <?php if(Session::getInstances()->hasFlashes()): ?>

        <?php foreach (Session::getInstances()->getFlashes() as $type => $message): ?>

            <div class="alert alert-<?= $type; ?>">

               <?= $message; ?>
             </div>

        <?php endforeach ?>
       <?php 

Mon fichier "header.php"

Bernès
Auteur
<?php 
     require 'include/loader.php';

      if (!empty($_POST)) {

        $errors=array();
        $db = App::getDatabase();
        $validation = new Validation($_POST);
        $validation->est_alphanumerique('nom',"Votre Nom n'est pas valide");
        $validation->est_alphanumerique('prenom',"Votre Prenom n'est pas valide");
        $validation->est_alphanumerique('pseudo',"Votre pseudo n'est pas valide");

        if($validation->est_valid()){
          $validation->est_unique('pseudo', $db, 'clients',"Ce pseudo est déja pris");
        }
        $validation->est_email('mail',"Votre email n'est pas valide");
        if($validation->est_valid()){
          $validation->est_unique('mail', $db, 'clients',"Cette adresse mail est déja utilisee pour un autre compte");

        }
        $validation->est_alphanumerique('description',"Votre Message n'est pas valide");

        if ($validation->est_valid()) {
          App::getAuth()->enregistrer($db, $_POST['nom'],
                  $_POST['prenom'], 
                  $_POST['pseudo'], 
                  $_POST['mail'], 
                  $_POST['sexe'],
                  $_POST['orientation']);

          $headers = 'FROM: cast@local.dev';
          $subject = 'Candidature pour le casting';
          $message = "<p>Nom :".$_POST['nom']."</p><p> Prenom : ".$_POST['prenom']."</p><p>Adresse Mail : ".$_POST['mail']."</p><p> Message :".$_POST['description']."</p><p> Orientation:".$_POST['orientation']."</p><p> sexe :".$_POST['sexe'];
          mail($_POST['mail'], $subject, $message, $headers);
          Session::getInstances()->setFlash('success', "Votre fiche a bien ete envoyee");          
          App::redirection('index.php');

        }else{
          $errors = $validation->get_errors(); 
        }
  }
?>

<?php 
$nomDeMapage = 'Inscription';
require 'include/header.php';
?>

Voila le fichier aui fait appel au header

As-tu vérifié que ton encodage ne contient pas de BOM ?
notepad++ te le dit et tu peux reconvertir en utf-8 sans bom

Bernès
Auteur

J'ai vérifié avec notepad++ et l'encodage semble être sur utf-8 sans BOM par défaut. je dev avec Netbeans au passage. Je précise que en local je n'ai pas d'erreur, c'est plutôt en environnement de production que l'erreur s'affiche

Le message est pourtant très explicit ;)
tu fais un session_start alors que tu as déjà envoyé des données au navigateur ;)
@plus
Pierre

Bernès
Auteur

C'est pour cela que j'ai envoyé des bouts de mon code. Je n'ai envoyé de données au navigateur , je n'aurais pas évoqué le sujet autrement

Salut,
Regarde bien les pièges ;)
Y a t'il une ligne vide au dessus de <?php ????
qu'as tu dans ton loader.php ?
es tu sûr que ta class validation ne fais aucun echo ??
mais de toutes façons, une chose est sûre, des données sont envoyées au navigateur avant ton session_start, c'est pas moi qui le dit, c'est php ;)

@plus
Pierre

Vu où est placé le Session::getInstance() dans les balises nav, c'est sûr qu'il y a du html avant
Soit tu forces un getInstance au début pour démarrer la session soit tu utilises la bufferisation ob_start ...
ta config 'local' utilise peut être la bufferisation ?

Utiliserais-tu ta classe plusieurs fois à certains moment ? Celà peux jouer avec ton session_start() du constructeur.
Modifie ton contructeur et met ceci :

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}