session et redirection, erreur de headers

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : session et redirection, erreur de headers

Re: session et redirection, erreur de headers

par xTG » 30 avr. 2011, 21:59

Cela vient de la configuration du serveur et cela tu ne pourras pas le changer.
Il est bien dit dans la documentation de la fonction header() qu'il ne faut rien envoyer au navigateur avant de l'utiliser.

Re: session et redirection, erreur de headers

par alista » 30 avr. 2011, 19:59

Pouratnt même en activant la gestion des erreurs le script marche bien local sans warning. De toutes façon même avec les erreurs désactivées il me semble que le script devrait s'arrêter après une telle erreur et ne rien afficher.

Alors je reprends les choses à la base pour comprendre le fonctionnement des headers et être certain que cela ne vient pas de mon hebergeur (Online).
Le renseignement des métas dans le head semble causer l'erreur mais uniquement en ligne.
J'ai fait ce simple script qui marche en local et pas en ligne:


<?php
SESSION_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
<meta name="description" content=""/>
<meta name="keywords" content=""/>
<meta name="author" content=""/>
<meta name="content-language" content="fr"/>
<meta name="robots" content="all"/>
</head>
<body>
<?php
header("Location: partenaires.html");
?>
</body>
</html>

Re: session et redirection, erreur de headers

par xTG » 27 avr. 2011, 15:36

Parce que tu n'as pas activé la gestion des erreurs en local.

Re: session et redirection, erreur de headers

par alista » 27 avr. 2011, 15:19

Bonjour et merci,
donc réorganiser la structure avec des fonctions et des fichiers inclus je pense.
Mais pourquoi tout marche à la perfection en local ?

Re: session et redirection, erreur de headers

par Mazarini » 27 avr. 2011, 14:13

Bonjour,

Je pense que le mieux est de bien organiser tes traitements

1) une partie initialisation ou tu récupères les données $_POST, $_GET, $_SESSION...
2) une partie ou tu fais les traitements de contrôle et de mise à jour (mise à jour session, mise à jour base...)
3) une partie ou tu affiches la page.

Avec cette organisation tu peux faire des redirects n'importe ou dans les parties 1 et 2.

Les fonctions ob_XXXXX sont très bien, mais je les réserve plutôt à la gestion des erreurs "techniques" avec suppression de tout l'affichage et affichage d'une page d'erreur (erreur SQL, erreur de connexion à une base...)

Re: session et redirection, erreur de headers

par alista » 27 avr. 2011, 13:26

Bonjour et merci de ton attention,

il y a le code css puis l'initialisation du panier.
Voici le code ma page:

<?php
SESSION_start();
require ("fonctionsCATALOGUE.php");
require ("connection.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>gâteaux_bonbons_corses_canistrelli</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<meta name="description" content="gâteaux corse,miels,canistrelli"/>
<meta name="keywords" content="specialites corses,gateaux,bonbons,farine châtaigne,canistrelli"/>
<meta name="author" content="Tosello"/>
<meta name="content-language" content="fr"/>
<meta name="robots" content="all"/>
<script type="text/javascript" language="javascript" src="lytebox.js"></script>
<link rel="stylesheet" href="lytebox.css" type="text/css" media="screen" />
<style> link{color:#FF9900;}
a:link{color:#FF9900;}
v:link{color::#CC7700;}
</style>
<style type="text/css">
<!--
body {
margin:0;
padding:0;

}
.Style1 {background:url(fdg.png);border:1px solid silver;
color: #CC6600;
font-weight: bold;
font-size: x-large;
font-style: italic;
}
#titre{position:absolute;background:url(fdg.png);
font-size:3em;
text-align:center;
font-family: Georgia, "Times New Roman", Times, serif;
color: #FFFFFF;
margin:auto;padding:auto;padding:10px;
left:34%;
top: 10px;
border:1px solid silver;
}

#index
{position:absolute;
font-size:1.5em;
top:200px;left:45%;
}

#commande
{font-size:2em;
}

#panier
{ position:absolute;background:url(fdg1.png);
font-size:0.8 em;
text-align:left;
font-family: Georgia, "Times New Roman", Times, serif;
color: #FFFFFF;
margin:auto;padding:auto;padding:4px;
width:320px;
height:80px;
right: -350px;
top: 10px;
border:1px solid silver;

}

#contenu_panier{display:visible;
position:absolute;background:url(fdg2.png);
background-repeat:repeat;
font-size:0.7em;
text-align:left;
font-family: Georgia, "Times New Roman", Times, serif;
color: #0000;
margin:auto;padding:auto;padding:5px;
right: -350px;
top: 110px;
border:1px solid silver;
}



#conteneur{position:relative;margin:auto auto auto auto;text-align:center;width:55%;background-color:#ffdeaf;border:1px solid silver;
}
#table{display: inline-block;position:relative;padding:5px;width:90%;text-align:center;background-color:#ffff;}

.total{color:red}

#vignettes{display: inline-block;position:relative;width:8%;height:50px;float:left; border-right:1px solid silver;}
#ID {display: inline-block;position:relative;width:10%;text-align:left;}
#prix{display: inline-block;width:10%;font-size:1.5em;color:red;font-weight: bold;}
#voir {display: inline-block;text-align:right;width:70%;margin:5px;}
#nom{display: inline-block;text-align:center;width:45%;}
#acheter{display: inline-block;text-align:center;width:10%;}
#photo1{position:absolute;width:200px;height:300px;left:-330px;border:2px solid black;top:1px;}
#photo2{position:absolute;margin:auto auto auto auto;width:300px;height:200px;left:-330px;border:2px solid black;z-index:200;top:330px;}

.zoom {
height:170px;
margin:auto;
}
.zoom p {
text-align:center;
}
.zoom img {
display:block;
width:35px;
height:60px;
}
.zoom img:hover {position:absolute;left:-30px;top:-80px;
width:120px;
height:170px;border:2px solid black;
}
-->

</style>
</head>


<?php

//$ID=$_POST['ID'];echo"$ID";
//$quantite=$_POST['quantite'];
//$prix=$_POST['prix'];


//.................panier avec session....................
//............................................................................
$page="gateaux";
$connection=connection($login,$pwd,$base,$serveur);
if(!isset($_SESSION['panier']))//**************si le panier n'existe pas on le créer

{

$_SESSION['panier']=array();
$_SESSION['panier']['ID']=array();
$_SESSION['panier']['nom']=array();
$_SESSION['panier']['quantite']=array();
$_SESSION['panier']['prix']=array();
$_SESSION['panier']['type']=array();
$_SESSION['panier']['image']=array();
header("Location: ".htmlspecialchars($_SERVER["PHP_SELF"]));
die();
}

//*************************************** y a t il 1 article à supprimer ******************
if (isset($_GET['sup'])){$supid=$_GET['art'];echo"$supid<br><br>";$testid=$supid;supprimer($testid,$connection,$db,$login,$pwd,$base,$serveur,$idclient);mysql_close($db);header("Location: ".htmlspecialchars($_SERVER["PHP_SELF"]));
die();}

//************************************* Faut il supprimer tout le panier et donc aussi le panier de la base sql***************
$del=@$_GET['del'];if ($del==1){session_destroy();
$sup = "delete from panier where idclient='$idclient' AND validation= 0 ";
$selresult=mysql_query($sup);
if(!($selresult)){echo "<br><br><br>Il n'y a pas d'article dans votre panier !";
echo "<A target=\"_self\" href=\"gateau.php\">Retour catalogue";}
header("Location: ".htmlspecialchars($_SERVER["PHP_SELF"]));}



if (isset($_POST["achat"])) //*********** Si le panier existe donc on empile les articles
{ $nb=@$_GET['nb'];
$ID=$_POST["achat"];
$nom=$_POST["nom"];
$prix=$_POST["prix"];
$image=$_POST["image"];
$quantite=$_POST["quantite"];
$testid=$_POST["achat"];
$nb_articles=count($_SESSION['panier']['ID']);




$position=array_search($testid,$_SESSION['panier']['ID']);
if($position!== false)
{
$_SESSION['panier']['quantite'][$position] +=1;
}

else
{ // Si l'article n'est pas déjà dans le panier, alors on l'ajoute.

array_push($_SESSION['panier']['ID'],$ID); echo"<br>";
array_push($_SESSION['panier']['prix'],$prix); echo"<br>";
array_push($_SESSION['panier']['quantite'],1); echo"<br>";
array_push($_SESSION['panier']['nom'],$nom); echo"<br>";
array_push($_SESSION['panier']['type'],$page); echo"<br>";
array_push($_SESSION['panier']['image'],$image); echo"<br>";
}
}



//print_r($_SESSION['panier']['nom']);
//print_r($_SESSION['panier']['ID']);
//print_r($_SESSION['panier']['quantite']);
//print_r($_SESSION['panier']['type']);
//****************************************************
//***************************************************
$i=@$_POST['i'];
$nb=intval(@$_GET['nb']);
$nblignes=intval(@$_POST['nblignes']);


$progression=10;
$connection=connection($login,$pwd,$base,$serveur);

$rec="select * from $page order by nom";
$resrec=mysql_query($rec);
$lignetot=mysql_num_rows($resrec);
$nombpage=ceil($lignetot/10); //calcul le nombre de pages



if (is_numeric($nb)){
if(($nb>=0)&&($nb<=$lignetot)){$valid=1;}
else{$valid=0;}}
else{$valid=0;}
if($valid=0){$nb=0;}
if (! ($nb)) {$nb=0;}elseif ($valid=0){$nb=0;}
else {$nb=@$_GET['nb'];}

$selection = "select * from $page order by nom limit $nb,$progression ";



$selectionresult=mysql_query($selection);
$nblignes=mysql_num_rows($selectionresult);
if(!($selectionresult))
{
print "selection impossible<br>";
}
else
{
echo"Nous sommes le : "; echo $date;

}
echo"<p>&nbsp;</p>";
echo"<body background=\"fond3.jpg\">";
echo "<div align=center id=titre>Les gâteaux, nougats et bonbons</div>";
echo "<div align=center id=index><A target=\"_self\" href=\"index.htm\">Retour accueil</a></div>";
echo"</BR></</BR></BR></BR></BR></BR></BR></BR></BR>";
echo"<p align=left><font color=black size=2><i><u>** Photos non contractuelles **</u></i></font></p>";
$i=1;

echo"<BR><div align=center id=conteneur>";

navigation($page,$connection,$nb);//**********************************affichage du catalogue
?>

<?php
while ($row=mysql_fetch_object($selectionresult))
{
?><form name=form method=POST action="" enctype=multipart/form-data><?php

affichage($page,$selectionresult,$row,$i,$connection,$nb);// ***************************avec progression
$nb++;
$i++;?>
</form><?php

}

//header('Location: '.htmlspecialchars($_SERVER['PHP_SELF']));

mysql_close($db);

mysql_close($db);

$connection=connection($login,$pwd,$base,$serveur);
navigation($page,$connection,$nb);mysql_close($db);




//contenupanier($idclient,$connection,$page,$db);
contenupanier_session($idclient,$connection,$page,$db);

?>
</div>





</body>
</html>

Re: session et redirection, erreur de headers

par sylvaing26 » 27 avr. 2011, 13:09

Il y a quoi ligne 145 (et avant) de ton fichier gateau.php ?

session et redirection, erreur de headers

par alista » 27 avr. 2011, 13:04

Bonjour à tous,
j'ai fait un panier virtuel avec des sessions et suite à une création, mise à jour ou supression du panier je fais une redirection :header("Location: ".htmlspecialchars($_SERVER["PHP_SELF"])); die();
Là j'ai un message Warning: Cannot modify header information - headers already sent by (output started at /amedia3test/gateaux.php:12) in /amedia3test/gateaux.php on line 145
Je précise qu' il n'y a pas d'espace ou de caractère avant session_start(); ou d'affichage envoyé au navigateur avant le header.Les fichiers ont étés encodés en utf8 sans bom puis en Ansi ,aucun changement.

Pour regler le problème j'ai utilisé le javascript ,ça marche mais bon pas terrible comme solution, en utilisant ob_start(); et ob_end_flush(); ça marche aussi.
Question 1: Quelle solution est la meilleure?
Question 2 : En local Je n'ai aucun souci tout marche à la perfection sans modification du code avec l'une ou l'autre des solutions, et sans message d'erreur. Pouquoi? si ça plante en ligne à cause des headers cela devrait aussi planté en local, non?

Merci de vos lumières, là je cale (surtout pour la question2).