IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[PHP-JS] envoi d'header


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Points : 52
    Points
    52
    Par défaut [PHP-JS] envoi d'header
    Bonjour,

    je fais appel à vos talents car je ne parviens pas à résoudre un problème que j'ai avec un header.

    En effet, j'ai une erreur "classique" du type "Warning: Cannot modify header information - headers already sent by (output started at D:\Programmation\index.php:10) in D:\Programmation\utilisateur\authentification.php on line 2"

    Je sais que l'erreur la plus courant est l'ajout d'html avant de balancer le header mais je ne parviens pas à résoudre le soucis, compte tenu de la construction de mon site...

    En effet ma page d'index se constitue de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php
    session_start();
    include_once "config/variablesCommunes.php";
    ?>
    <html>
    <head>
    <link rel="stylesheet" media="screen" type="text/css" title="Design" href="style/style.css" />
     
    <script language="JavaScript">
     
    //Un peu de JS est placé ici théoriquement
    }
     
    </script>
     
    </head>
     
    <body>
     
     
    <div class="header">
    <?php
     
    include("header.php");
     
    ?>
    </div>
     
    <div class="menu">
    <?php
    include("menu.php");
    ?>
    </div>
     
    <div class="contenu">
    	<?php
    		if ($_SESSION['utilisateur_connecte'] == NULL) {
    			switch($_GET['page']){
    			case 'formulaireLog' :
    				include "utilisateur/formulaireLog.php";
    				break;
    			case 'authentification' :
    				include "utilisateur/authentification.php";
    				break;
    			case 'bravo' :
    				include "utilisateur/bravo.php";
    				break;
    			}
    		}
     
     
    etc...
    Et pour le log, ça se passe de la manière suivante. Il y a un formulaire très basique qui envoie vers ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
    header('Location: index.php?page=bravo');
    //include_once "../config/variablesCommunes.php";
     
    $_SESSION['utilisateur_connecte'] = false;
    		$requete = null;
     
    		$mdp = $_POST['mdp'];
    		$mdp = md5($mdp);
     
    		$requete = mysql_query("SELECT * FROM utilisateur WHERE utilisateur_login='".$_POST['login']."' AND utilisateur_mdp='".$mdp."';");
     
     		$donnees = mysql_fetch_array($requete);
     
     	//Connexion réussie!
     		if ($donnees != null) {
    	 		$_SESSION['utilisateur_connecte'] = true;
    	 		$_SESSION['idUser'] = $donnees['utilisateur_id'];
    	 		echo "Vous êtes connecté!";
     
     		}
     
     	//Connexion échouée
     		else {
     			echo "Vous n'êtes pas connecté!";
     		}
     			?>

    Et donc voilà, quand je tente de valider le formulaire, la page n'est pas redirigée et j'ai le message d'erreur indiqué plus haut. Pour info, la ligne 10 ma page d'index est la ligne suivante: "<script language="JavaScript">". J'ai beau commenter la chose, la ligne indiquée est toujours la ligne 10. Et si je supprime une ligne vierge avant, le nombre passe à 10. Je ne comprends pas tout....

    Je précise aussi une chose importante: un autre envoi de header est utilisé dans mon site mais pour une action totalement différente de l'identification! Elle redirige également vers l'index.

    Bon voilà, j'espère avoir été le plus clair. Je suis présent pour n'importe qu'elle question qui pourrait faire avancer le problème!

    Merci !!

    David

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Je me permets d'apporter une solution de secours à mon problème. On peut utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    echo '<script language="Javascript">
    <!--
    document.location.replace("index.php?page=bravo");
    // -->
    </script>';
    ?>
    à la place du header mais.... j'aimerais bien trouver une solution au problème histoire de ne pas utiliser de javascript (qui est d'ailleurs désactivable par l'utilisateur...)

    Merci

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Ben en fait tu as la réponse à ta question... tu as envoyé, dans ton fichier index.php, du contenu html avant d'arriver sur la ligne #2 de ton script authentification.php qui fait une redirection via header()

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Ca veut dire qu'on ne peut pas utiliser d'header quand on utilise des includes??

    Je l'utilise pourtant à un autre endroit dans mon code. Peut-être que l'application est différente vu que c'est encore une autre div qui est mise à jour? J'avoue que je suis bien paumé là...

    En plus le code javascript que j'ai mis, il fonctionne à peu près seulement... (m'enfin j'ai du mal à m'en servir en tout cas... il ne me redirige pas très bien)

    Bon alors les includes sont incompatibles avec les envois de header?

    Merci en tout cas de ta réponse

    David

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par divad Voir le message
    Bon alors les includes sont incompatibles avec les envois de header?
    La réponse est non. Tu peux tout à fait utiliser header() conjointement à include().


    Soit le fichier A.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    echo 'Je suis A';
    include 'B.php';
    ?>
    Et le fichier B.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    echo 'Je suis B';
    ?>
    Si tu executes A.php, le résultat est équivalent à si tu avais écris le script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    echo 'Je suis A';
    echo 'Je suis B';
    ?>
    Ainsi si tu modifies ton script B.php comme suit afin de faire une redirection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    //echo 'Je suis B';
    header('Location: /ma/page.php');
    ?>
    Alors ça reviens au final à avoir le script suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    echo 'Je suis A';
    //echo 'Je suis B';
    header('Location: /ma/page.php');
    ?>
    Et là on voit qu'il y a un problème car on envoie du contenu au navigateur via le echo avant de faire appel à header, ce qui est mal.
    L'exemple montré ci dessus est complètement transposable à ton scénario :
    - A.php est ton index.php
    - B.php est ton authentification.php

    Donc pour résoudre ton problème tu as plusieurs solutions:
    1. réorganiser ton code pour être sur que lorsque tu passes sur l'instruction header(), aucun contenu n'a été envoyé
    2. bufferiser la sortie de ton script. Toutes les données transmises au navigateur sont mises dans un cache temporaire vidé à la fin du script, ce qui permet d'envoyer les header() quand tu veux. Voir http://php.net/outcontrol
    3. détecter l'envoi de contenu avant d'utiliser header pour utiliser une forme alternative (redirection côté client via un meta html ou un code javascript). Voir http://php.net/headers_sent


    La 1° est la solution préférée mais pas la plus facile (seule l'expérience permet de s'en sortir à moindre frais) ni la moins couteuse (Faut réécrire l'ensemble des scripts). Cependant c'est la plus propre.
    La 2° est rapide à mettre en oeuvre une fois le principe de bufferisation compris. Cependant la maintenance s'en retrouve alourdie car, entre autres, les possibilités de "debug" (du genre: echo "trace" ou autre var_dump()) sont elles aussi bufferisées.
    La 3° est la plus simple techniquement mais à utiliser à chaque appel à header() donc au cas par cas. Ce qui ne facilite pas la maintenance et ne respecte pas le principe DRY - Don't Repeat Yourself. De plus peut reposer sur un code javascript pas forcément interprété par le navigateur en fonction des prefs de l'utilisateur.

    Hope this helps

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Merci pour cette réponse complète!

    Il faudra que je vois l'histoire du buffer plus précisément. Ca doit être bien pratique tout de même...

    J'ai opté pour le moment pour le retour en JS. Je me dis que le mec qui désactive JS ne pourra pas profiter de pas mal de sites (ajax...) donc déjà il n'est pas bien malin. De plus, la page qui fait le traitement pourra contenir une alerte du genre "Vous n'utilisez pas le JS (blaireau), mais cliquez ici pour retourner à la page d'accueil, votre authentification à tout de même fonctionné"?
    Comme ça, ça fonctionne quoi qu'il arrive je pense. Bien que cette page sera une page "plein écran" qui ne contiendra pas le menu et tout et tout (m'enfin je pense).

    Merci encore!!

    David

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par divad Voir le message
    Je me dis que le mec qui désactive JS ne pourra pas profiter de pas mal de sites (ajax...) donc déjà il n'est pas bien malin. De plus, la page qui fait le traitement pourra contenir une alerte du genre "Vous n'utilisez pas le JS (blaireau), mais cliquez ici pour retourner à la page d'accueil, votre authentification à tout de même fonctionné"?

    Pas malin, blaireau... Hum hum ! Un peu plus de respect des utilisateurs serait plus sympa. Sinon ça sert à rien de faire un site web...
    Par exemple, NoScript, une extension Firefox, permet de naviguer plus sereinement en activant javascript uniquement pour les sites dans lesquels l'utilisateur a pleinement confiance (banque, ...) Le javascript ne sera pas activé pour les autres sites, est-ce que ça fait de ces utilisateurs des blaireaux ?

    Sans oublié également la notion d'accessibilité au sens large. Par exemple est-ce que le Screen Reader d'un aveugle va forcément interpréter le javascript ?

    Ceci étant dit, si tu utilise le javascript, il faut en effet fournir une alternative, un simple lien comme tu le suggères sera suffisant.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Rhoooo je rigolais pour le blaireau

    Mais oui, en effet, la solution la plus adaptée est sans doute de mettre des liens sur la page de traitement.

    Merci pour les infos.

    Bonne journée!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/04/2006, 11h00
  2. php erreur dans le header
    Par carmen256 dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2006, 14h53
  3. [Php/MySQL] Envoi de mails selon requête
    Par martonpylon12 dans le forum Débuter
    Réponses: 7
    Dernier message: 28/03/2006, 15h00
  4. [PHP-JS] Envoi de données sur une même page...
    Par dudux dans le forum Langage
    Réponses: 8
    Dernier message: 14/09/2005, 14h51
  5. [PHP-JS] Envoi de variable sans passer par un submit
    Par adilou1981 dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2004, 20h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo