session et redirection, erreur de headers

Petit nouveau ! | 4 Messages

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).

Mammouth du PHP | 686 Messages

27 avr. 2011, 13:09

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

Petit nouveau ! | 4 Messages

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>

ViPHP
ViPHP | 2577 Messages

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...)

Petit nouveau ! | 4 Messages

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 ?

ViPHP
xTG
ViPHP | 7331 Messages

27 avr. 2011, 15:36

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

Petit nouveau ! | 4 Messages

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>

ViPHP
xTG
ViPHP | 7331 Messages

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.