Partage
  • Partager sur Facebook
  • Partager sur Twitter

PROBLEME OUVERTURE CONNEXION PHP

Sujet résolu
28 décembre 2017 à 10:57:15

Bonjour,

Je viens chercher votre aide car je suis en train de créer un site comprenant du PhP pour mon cursus à la fac, mais dés lors que je veux me connecter j'ai cette erreur qui apparait :

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /Users/hugoalcrz/Desktop/ProjetReseau/interface1/connexion.php:1) in /Users/hugoalcrz/Desktop/ProjetReseau/interface1/connexion.php on line 69

Je ne comprends pas le problème aussi car c'est un projet en binôme et sur l'ordinateur de celui qui est avec moi, cela fonctionne parfaitement sans ce warning (on a tout les deux des MacBook) ! J'ai eu beau chercher sur internet je n'ai rien trouvé !

Voici la fonction connexion:

<!DOCTYPE html PUBLIC>
<html xml:lang="fr">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <meta http-equiv="Content-Language" content="fr">
 <link rel="icon" type="image/x-icon" href="images/favicon.ico" />
 <title> Connexion </title>
 <link href="css/style.css" rel="stylesheet" type="text/css" />
</head>

<body>
  <div class="titre">
   <!-- Titre géré en CSS -->
 </div>
<center>

<ul class="menu">
 <li><a href="accueil.php"><b>Accueil</b></a></li>
 <li><a href="ip.php"><b>IP</b></a></li>
 <li><a href="dhcp.php"><b>DHCP</b></a></li>
 <li><a href="mail.php"><b>Mail</b></a></li>
 <li><a href="forum.php"><b>Forum</b></a></li>
 <li><a href="filtrage.php"><b>Filtrage</b></a></li>
 <li><a href="debit.php"><b>Débit</b></a></li>
 <li class="current"><a href="connexion.php"><b>Connexion</b></a></li>
</ul>

    <br><br>
  <div id="connexion">
    <p>
     <form method="post" action="connexion.php?connexion=envoyer">
     <fieldset>
     <fieldset>
       <legend> Coordonnées </legend>
       <label> Identifiant : </label>
       <input type="text" name="login" placeholder="Entrez votre login" required autofocus/><br><br>
       <label> Mot de passe : </label>
       <input type="password" name="mdp" placeholder="Entrez votre mot de passe" required/><br><br>
     </fieldset>
       <br>
       <input type="submit" value="Connexion" />
       <input type="reset" value="Réinitialiser" />
     </form> </p>
    </fieldset>
   <?php
   $hostname="localhost";
   $username="root";
   $password="";
   $dbname="PROJET_AH_RM";

  $connexion = mysqli_connect($hostname, $username, $password) or die('Problème lors de la connexion à MySQL');
  mysqli_select_db($connexion, $dbname);

  if (isset($_POST['login']) and isset($_POST['mdp'])) { //Si les champs ony été saisis
   $login = $_POST['login'];
   $pwdmd5 = md5($_POST['mdp']);

   //Je choisis le champ login
   $reponse_login = mysqli_query($connexion, "SELECT login FROM connexion"); // Je choisis de la base de donné login le champ login
   $reponse_password = mysqli_query($connexion, "SELECT mdp FROM connexion"); // Je choisis de la base de donné login le champ login
   $reponse_id = mysqli_query($connexion, "SELECT id FROM connexion"); // Je choisis de la base de donné login le champ login
   //Je vérifie tout mes champs logins
   while ($donnees = mysqli_fetch_array($reponse_login) AND $donnees2 = mysqli_fetch_array($reponse_password)) // EDIT : Il n'y a plus d'erreur mais c'est à la ligne 20 maintenant
   {
       if ($login == $donnees['login'] AND $pwdmd5 == $donnees2['mdp']) // ERREUR ICI
       {
           // La suite de mon code qui y sera après que je n'ai plus d'erreur et pour l'instant c'est :
           echo "Connexion réussi, vous êtes identifié avec le compte ", $login, ".";
           session_start();
           //$_SESSION['id'] = $donnees['id']; // marche pas il faut trouver comment recup son id
           $_SESSION['login'] = $_POST['login'];
           $_SESSION['pwd'] = $pwdmd5;

           //session_start();
           sleep(2);
           //echo '<meta http-equiv="refresh" content="0;URL=accueil.php">'; // Redirection fonctionne


           exit();

       }
   }
   $reponse_login->close(); // Termine le traitement de la requête
   $reponse_password->close(); // Termine le traitement de la requête
  }
   ?>
  </div>

</center>
</body>
</html>



Je demande donc votre aide, pour savoir si c'est un problème de code, du navigateur (j'ai essayé sur deux différents) ou autres !

Merci d'avance !

-
Edité par HugoAlcaraz 28 décembre 2017 à 11:04:50

  • Partager sur Facebook
  • Partager sur Twitter
28 décembre 2017 à 12:06:05

Tu devrais lire la documentation de session_start(), Il est explicitement écrit :

Pour utiliser des sessions basées sur les cookies, session_start() doit être appelée avant d'afficher quoi que ce soit dans le navigateur.

Autrement dit, aucun code HTML ne doit être écrit avant d'utiliser session_start()

En vérité, aucune action provoquant l'envoie des headers http de ta réponse ne doit être utiliser avant session_start(), cela comprend les instruction comme echo, var_dump, print, print_r, flush, ect...

  • Partager sur Facebook
  • Partager sur Twitter
28 décembre 2017 à 13:50:34

Merci de ta réponse, j'ai lu diverses fois qu'il devait être appelé avant d'afficher quoi que ce soit, mais est-ce que cela comprend aussi le code HTML présent sur la page ou alors seulement dans le code PHP ?

Je sais aussi qu'il faut faire un session_start() au début de la page, mais c'est seulement pour les pages ou l'on rentre en mode "connecté" ? La je ne peux pas le mettre en haut car c'est ma page de connexion ?

Tu m'as donc dis aucun code HTML, mais je ne comprends pas si c'est le code HTML présent au début de mon fichier ou celui dans la balise php qui dérange ou bien les 2 ? 

-
Edité par HugoAlcaraz 28 décembre 2017 à 13:52:46

  • Partager sur Facebook
  • Partager sur Twitter
28 décembre 2017 à 16:39:35

Bonjour,

Tout code html y compris les doc type de début de page. En gros lors de l'ouverture des sessions même une entête ne doit pas avoir était transmise au navigateur. De plus utiliser session_start() dans une boucle est une très mauvaise idée et risque de planter le script.

Pourquoi faire trois requêtes? récupère tes info dans une seule requête!! Mettre un mdp même haché dans une session n'est pas géniale. En générale on va mettre en session le login et l'id d'un membre.

-
Edité par tartanpion52 28 décembre 2017 à 16:41:52

  • Partager sur Facebook
  • Partager sur Twitter
Merci de signaler votre sujet résolu, cela nous évite des pages de lecture inutile pour arriver au bout de 15 réponses sur la dernière qui dit "merci problème résolut!"
28 décembre 2017 à 16:43:06

Tout texte en dehors des balises <?php ?> est considérer comme "envoyé au navigateur".

Je sais aussi qu'il faut faire un session_start() au début de la page, mais c'est seulement pour les pages ou l'on rentre en mode "connecté" ? La je ne peux pas le mettre en haut car c'est ma page de connexion ?

session_start() est une fonction qui va récupérer les cookie de session de l'utilisateur pour créer le tableau $_SESSION, si ta page-réponse utilise $_SESSION, tu doit appeler session_start().

Tu m'as donc dis aucun code HTML, mais je ne comprends pas si c'est le code HTML présent au début de mon fichier ou celui dans la balise php qui dérange ou bien les 2 ?

Oui, un script php commence au début du fichier .php et pas au début de la balise <?php  qui, en réalité est plutôt un marqueur pour faire la différence entre la syntaxe php et le reste.

  • Partager sur Facebook
  • Partager sur Twitter
28 décembre 2017 à 17:13:28

Tout d'abord, merci à tout les deux pour vos réponses !

Je ne vois pas comment faire alors, car comment afficher le reste de ma page ? Il faudrait alors que je mette seulement mon code php de connexion pour que cela fonctionne ? Je ne vois pas comment faire pour me connecter sans faire apparaitre d'autres champs avant ?

Je n'arrive pas à comprendre le fait aussi que sur l'ordinateur de mon binôme de projet cela fonctionne sans aucune erreur avec le même code et moi impossible...

Si je fais une seule requête cela donnerez donc :

if (isset($_POST['login']) and isset($_POST['mdp'])) { 
   $login = $_POST['login'];
   $pwdmd5 = md5($_POST['mdp']);


$reponse = mysqli_query($connexion, "SELECT * FROM connexion");
   while ($donnees = mysqli_fetch_array($reponse))
   {
       if ($login == $donnees['login'] AND $pwdmd5 == $donnees['mdp'])
       {
           session_start();
           $_SESSION['login'] = $_POST['login'];
           $_SESSION['pwd'] = $pwdmd5;

Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter
28 décembre 2017 à 17:23:14

Re,

Sur le PC de ton binôme cela fonctionne car la configuration du serveur n'est surement pas la même avec les erreur php désactivées.

Pour ton code je te conseil de relire le cours sur php car la je pense que tes lacunes sont trop importantes pour que tu puisses avancer sereinement sur un projet.

  • Partager sur Facebook
  • Partager sur Twitter
Merci de signaler votre sujet résolu, cela nous évite des pages de lecture inutile pour arriver au bout de 15 réponses sur la dernière qui dit "merci problème résolut!"
28 décembre 2017 à 17:37:29

Re,

Merci, malgré qu'il ait désactivé les erreurs, comment est-ce possible que le logiciel l'accepte ? 

Comment le programme peut fonctionner avec une erreur ? 

Oui, je m'en doutais que ce serait pas si simple, je devais m'y pencher après avoir résolu le problème de connexion mais ça fait plusieurs jours que je suis bloqué dessus, sans trouvé d'issue donc je n'avance plus...

  • Partager sur Facebook
  • Partager sur Twitter
28 décembre 2017 à 17:56:51

Je ne vois pas comment faire alors, car comment afficher le reste de ma page ? Il faudrait alors que je mette seulement mon code php de connexion pour que cela fonctionne ? Je ne vois pas comment faire pour me connecter sans faire apparaitre d'autres champs avant ?

Ho, tu as un gros soucis de compréhension sur le fonctionnement d'une requête et son traitement. tu n'as pas besoin d'écrire ton formulaire HTML avant ton code PHP pour traiter ta requête. Tu n'a même pas besoin que le formulaire soit sur la même page.

Il est même préférable d'écrire ton HTML en dernier pour éviter ce genre de problème (headers already sent) lors de la gestion des sessions, cookie ou redirection.

Je te propose de structurer ton script de la façon suivante

<?php

// Initialisation pour pouvoir utiliser $_SESSION
session_start();

// init BDD


// on vérifie si un formulaire à été soumis
if(isset($_POST['submitLogin']))
{
    // on vérifie les champs et on connecte l'utilisateur
    // si la connection est ok, on redirige l'utilisateur sur une autre page
    header('Location: account.php');
    exit;
}


// si nous arrivons à ce point du programme c'est qu'il n'y a pas eu de redirection, on peut envoyer le formulaire de connexion sur le navigateur du client
?>
<form method="post" target="connexion.php">
    <input type="password" name="passwd"/>
    <input type="submit" name="submitLogin"/>
</form>

Merci, malgré qu'il ait désactivé les erreurs, comment est-ce possible que le logiciel l'accepte ? Comment le programme peut fonctionner avec une erreur ?

Je suis d'accord avec l'explication de tartanpion, l'erreur "Header already sent" ne soulève que un warning et pas une fatal-error. Donc, ça ne crash pas, mais si tu vérifie, le tableau $_SESSION sera systématiquement null

-
Edité par Cobs 28 décembre 2017 à 18:07:58

  • Partager sur Facebook
  • Partager sur Twitter
28 décembre 2017 à 18:06:38

Merci encore de ton aide, je vais essayer de comprendre cela.

Oui, je suis d'accord que cela ne génère qu'un warning lors de l'erreur, mais comme tu le dis le tableau $_SESSION est bien vide car dés que j'arrive sur ma page de redirection il y a bien marqué que je suis pas connecté !

-
Edité par HugoAlcaraz 28 décembre 2017 à 18:16:23

  • Partager sur Facebook
  • Partager sur Twitter
26 mars 2024 à 9:25:49 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


26 mars 2024 à 12:44:48

@IssaOuédraogo Bojonjour, merci de ne pas squatter le sujet résolu des autres, créer votre propre sujet  dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (Un bonjour ou des salutations à la communauté et se termine par des remerciements par avances pour les futures réponses), la description de votre problème et le code que vous avez écrit inséré sur le forum à l'aide de l'outil d'intégration de code soit le bouton code </>

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Liens conseillés

Je ferme ici

-
Edité par AbcAbc6 26 mars 2024 à 12:46:19

  • Partager sur Facebook
  • Partager sur Twitter