Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/10/2011, 17h59   #1
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Par défaut La mauvaise entente entre session_start et header()

Bonsoir à tous,

Pour ce soir, je viens vous demander un renseignement, et pourquoi pas des tuyaux sur un problème que je retrouve fréquemment..

Tout d'abord, si j'ai bien compris, on ne peut pas mettre de header('Location[...] alors que session_start() a été déclaré avant ?
Parce que mon problème est que je me connecte à un compte, via les variables de sessions. Donc la présence de session_start() à chaque page est important pour vérifier si l'utilisateur est connecté ou non...
Mais un peu plus loin dans le code, j'execute des fonctions, qui une fois terminées peuvent amener à une redirection .. Problème:
L'habituel message d'erreur auquel j'ai le droit: headers already sent blablabla..
(Je n'ai bien évidement pas de code html avant !)

Bref, s'il n'est pas possible d'utiliser les headers, que faire ?
J'ai tenté de cette façon:
Code :
1
2
3
4
5
6
function Redirect($dest) {
        if (!headers_sent())
            header('Location: '.$dest);
        else
            echo '<script language="JavaScript">window.location=\''.$dest.'\'</script>';
    }
Mais bon, le javascript n'est pas adapté dans ce cas, il est beaucoup trop long étant donné qu'il est executé après php (Je soumets un formulaire, et suivant le résultat je redirige)...

Bref, avez-vous des propositions à me faire, améliorations ?

Je vous remercie d'avance de votre aide
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 18h08   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par Arget Voir le message
Tout d'abord, si j'ai bien compris, on ne peut pas mettre de header('Location[...] alors que session_start() a été déclaré avant ?
tu ne peut mettre aucune entete (dont session_start) après que du texte est été envoyé à la sortie.
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 18h24   #3
Membre éclairé
 
Avatar de Inazo
 
Gérant - société de développement web
Inscription : avril 2007
Messages : 290
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Gérant - société de développement web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2007
Messages : 290
Points : 360
Points : 360
Bonjour,

En fait le soucis c'est que tu affiche dès que tu peux, pour ma part je ne fait mes affichage cas la fin de mes script donc je n'ai qu'un seul echo, tout le reste est stocké dans une variable en attendant. Et donc je peux faire mes redirection quand bon me semble.

Cordialement,
__________________
Si vous débutez en PHP : Tutoriel pour grands débutants

Mes tutoriels : http://alexandre-joly.developpez.com/
Inazo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 18h45   #4
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
En toute théorie, je n'ai vraiment pas de code html avant mes header ...

Je vous présenté l'architecture de mon index.php:
Code :
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
 
<?php
 
    session_start();
 
    require '../required.php';
    include 'commun.php';
 
    $content = null;
    if(isset($_GET['content'])) {
 
	$content = $_GET['content'];
 
    }
    if($content == null) $content = "home";
 
    if(!isset($_SESSION['login']) && $content != "login"){
 
	Redirect('index.php?content=login');
 
    }
 
    include 'templates/formulaire-gestion.php';
 
 
<!DOCTYPE html>
<html>
 
 
    <head>

Voilà, donc en gros, le required.php appelle mes classes qui ne font que des requêtes SQL.
Le commun.php contient uniquement des fonctions...
Et pour finir le formulaire-gestion.php contient toutes les gestions de formulaires, qui a la fin des appels aux classes/traitement de formulaire ont une redirection par header('Location [...]

Que faire ? xD
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 18h52   #5
Membre éclairé
 
Avatar de Inazo
 
Gérant - société de développement web
Inscription : avril 2007
Messages : 290
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Gérant - société de développement web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2007
Messages : 290
Points : 360
Points : 360
Tout affichage avant qu'il soit html ou non va le faire râler. Même un caractère avant le <?php va le bouler.

Après si ton programme déclenche une notice par exemple il va pas être d'accord non plus. Dans tous les cas si il te dit qu'il y a un affichage il a raison mais ce n'est pas toujours simple à trouver.

Cordialement,
__________________
Si vous débutez en PHP : Tutoriel pour grands débutants

Mes tutoriels : http://alexandre-joly.developpez.com/
Inazo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 18h59   #6
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Je vérifierais demain, mais au passage, en cherchant sur google je suis tombé sur ça:
Q: Mais comment je fais alors pour faire une redirection avec header() si j'utilise session_start() avant?

R: C'est impossible, en ce cas il faut choisir un moyen de faire une redirection, typiquement celà se fait en javascript, ou mieux: en html dans la balise meta refresh:


Est-ce vrai ? ^^
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 19h10   #7
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Par la même occasion, juste une petite aide pour le débug:

Warning: Cannot modify header information - headers already sent by (output started at /homez.xxx/xxx/www/agence-xxx/classes/TraitementImages.php:1) in /homez.xxx/xxx/www/agence-xxx/gestion/templates/formulaire-gestion.php on line 15

Signifie que le problème vient de "TraitementImages.php" ?

Merci d'avance .
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 22h06   #8
Membre éclairé
 
Avatar de Inazo
 
Gérant - société de développement web
Inscription : avril 2007
Messages : 290
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Gérant - société de développement web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2007
Messages : 290
Points : 360
Points : 360
Oui visiblement tu as une sortie faites par ce script d'image en question, donc vérifie bien ce que fait ce script.

pour ce que tu as sortie de la FAQ j'ai un vilain doute moi j'ai jamais eu de soucis à faire de header() après un session_start() à partir du moment ou session_start n'affiche rien.

Cordialement,
__________________
Si vous débutez en PHP : Tutoriel pour grands débutants

Mes tutoriels : http://alexandre-joly.developpez.com/
Inazo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 22h46   #9
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Bah jusqu'à maintenant, moi non plus, d'où ma question ^^.

Autrement une question à moitié en rapport avec le thème:
Pourquoi il n'y a aucuns soucis avec les header() en local contrairement à un hébergement en ligne ?
Tout comme là, étrangement, je n'arrive pas à atteindre certaines tables de ma BDD alors qu'en local tout allait bien ^^

Sur quoi est-ce qu'on retrouvera de tels changements et pourquoi ? ^^

Grosses questions existentielles du mercredi soir là quand même !
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 09h42   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
faut toujours mettre le output_buffering sur Off
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 10h28   #11
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Oui oui, je l'avais bien mis sur off dans le php.ini, mais aucuns changements notables :/.

Merci quand même pour ta proposition !
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 16h00   #12
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
Citation:
Envoyé par Arget Voir le message
Tout comme là, étrangement, je n'arrive pas à atteindre certaines tables de ma BDD alors qu'en local tout allait bien ^^

Sur quoi est-ce qu'on retrouvera de tels changements et pourquoi ? ^^
J'sirais un problème de droits... Quelle erreur est remontée?
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 21h27   #13
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Cette erreur était très bête en fait, simplement une histoire de casse pour l'appel à la table ^^.

Bref, merci à tous pour toutes ces petites précisions dans tous les cas, elles m'ont été fortes utiles !
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 20h50   #14
Membre régulier
 
Inscription : août 2005
Messages : 342
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 342
Points : 76
Points : 76
Envoyer un message via MSN à akrogames
Bonjour a tous,

J'ai longtemps été confronté a ce genre de problème. En effet, même lorsqu'il y a un session_start() tu peux théoriquement faire des redirections juste après. Seulement les applications d'aujourd'hui il y a souvent des affichage dans le buffer du serveur qui ne se voit pas. Et donc il grogne.

J'ai rencontré le soucis dans mes vieilles applications et la seul solution de maintenance a été d'utiliser du javascript dans du PHP, je marchais un peu sur la tête. Mais c'était la seule solution qui fonctionnait.

Je sais pas si tu peux faire le test mais j'avais essayé de faire une redirection avec ob_start(), ob_end, ob_flush et j'avais réussi en jouant avec ces fonctions a faire finalement ma redirection avec header.

D'ailleurs j'avais écrit un framework perso pour faciliter la création de mes sites avant de passer a Zend Framework car on ne peut pas concurrencer une centaine d'ingénieur Et pour faire mes redirections je jouais avec la temporisation de sortie. Maintenant pour tes futurs projet il faudrait que tu réfléchisse peut être a un autre style d'architecture.

Bonne soirée
akrogames est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 12h15   #15
Membre à l'essai
 
Homme F. Mithieux
Étudiant
Inscription : juin 2008
Messages : 99
Détails du profil
Informations personnelles :
Nom : Homme F. Mithieux
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2008
Messages : 99
Points : 20
Points : 20
Merci pour toutes ses précisions Akrogames .

Bon, il s'avère que j'ai trouvé la source du problème (ne vous inquiétez pas, cela ne fait pas une semaine que je cherche xD). En faisant une requête Ajax, je me voyais obligé dans le fichier php appelé de faire appel à mes classes pour faire mes requêtes...

Et là, je me rend compte, que le problème vient justement de ces fameuses classes ... Je me mets à chercher, et identifie la source:

Stupeur: Ma classe ressemblait à ça:
Code :
1
2
3
4
5
 
 
<?php
 
/* etc ... */
C'est à dire, je sautais une ligne avant de déclarer que je suis en php .........

Franchement, c'est quand même fou !

Je pense qu'il va être temps pour moi de passer à un bon vieux framework ^^.
D'ailleurs, avis aux amateurs:
Symfony ou Zend ?
J'ai l'impression que Symfony est beaucoup plus demandé sur munster/lesjeudis.com ?


On divague hein ^^
Arget est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h00.


 
 
 
 
Partenaires

Hébergement Web