Erreur avec setcookie() et header()

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 : Erreur avec setcookie() et header()

par thehawk » 13 août 2006, 21:15

  setcookie("passe6",$val["nivo"]);
         
         Header("Location: ".$_SERVER["PHP_SELF"]);
rajout
$timestamp_expire = time() + 365*24*3600 // le temps ou le cookie est valide
setcookie("passe6",$val["nivo"],$timestamp_expire);
normalement ca marche

par iclo » 11 août 2006, 12:21

Il vaudrait mieux aussi supprimer les "@" dans ton code, car cela bloque l'affichage des messages d'erreurs, ce qui est rès déconseillé, car sans message d'erreurs il est quasi impossible de trouver d'où vienne des erreurs d'exécutions;

Pour ton problème de header, il y a un post complêt sur ce sujet dans la FAQ.
(ps: toujours jeter un coup d'oeil à la FAQ avant de poster une demande d'aide sur le forum :wink: :wink: )

par Invité » 11 août 2006, 11:54

ryle j'ai inversé comme tu me la dit, les erreurs sont les memes...
j'ai pas bien compris ce que tu ma dit avec la compatibilité de mon serveur ? je dois faire quelques chose ?

zeus si je l'enlève le set cookie je n'ai plus que la deuxieme erreurs, mais erreur quand meme...
j'ai du mal a saisir pourquoi ca ne fonvtionne pas !...

par zeus » 11 août 2006, 11:09

Si tu ne fait pas le setcookie(), est-ce que l'erreur est toujours là ?

Il est possible que le setcookie() envoi des entete HTTP, ce qui expliquerait que le header ne fonctionne pas :-k

par Ryle » 11 août 2006, 11:04

Tu ne peux pas faire de header(location:) après un setcookie, dans la mesure ou tu envois des données au navigateur.

En revanche normalement, tu peux fair le contraire : demander la redirection et juste après définir le cookie. En effet, même avec un header() le reste du script continue d'être exécuté.

Essaye donc comme ceci :
header("location:" . $_SERVER["PHP_SELF"]); 
setcookie("passe6",$val["nivo"]); 
exit(); // evite de lire la suite du code

Toutefois, d'après les commentaires de php.net, ceci ne fonctionne pas sur un serveur IIS 5 où le header est immédiatement exécuté..

par Invité » 11 août 2006, 10:51

les deux lignes qui posent problemes sont celle-ci :
  setcookie("passe6",$val["nivo"]);
         
         Header("Location: ".$_SERVER["PHP_SELF"]);
c'est donc dans la création du cookie que ca bloque !
esque ce ne serait pas un probleme d'écriture dans le dossier qui bloquerai la création du cookie ?
faut-il que j'active les droit d'écriture a tous dans ce dossier ??
comment puis-je faire cet manip, je n'utilise pas linux ! je suis sous windows

par Invité » 11 août 2006, 10:18

personne ne peut m'aider ?
quelle est ce message d'erreur ? que faut-il que je fasse pour que ma session fontionne ??

par Invité » 10 août 2006, 16:52

oui

Warning: Cannot modify header information - headers already sent by (output started at /var/www/11/g/l/o/xxxxx/www/DevisTest/admin.php:3) in admin.php on line 22

Warning: Cannot modify header information - headers already sent by (output started at /var/www/11/g/l/o/xxxxx/www/DevisTest/admin.php:3) in admin.php on line 24

par graphistnet » 10 août 2006, 16:47

L'erreur est-elle identique? il faudrait afficher le message d'erreur

par Invité » 10 août 2006, 16:45

les lignes a erreur sont :
setcookie("passe6",$val["nivo"]); 

Header("Location: ".$_SERVER["PHP_SELF"]);

par Invité » 10 août 2006, 16:40

merci pour les précisions ! je ne savais pas !
mais mes erreurs persiste !

voici mon code a présent:(jai mi toute ma page)


<?
// si le lien contient ?pass=no
// on vide le cookie
if(@$_GET["pass"]=="no") {
   setcookie("passe6");
   Header("Location: ".$_SERVER["PHP_SELF"]);
}
// Connexion à la BD
 $db = mysql_connect('sql.xxxxx.fr','xxxxx','xxxx') or die ("erreur de connexion");
mysql_select_db('xxx',$db) or die ("erreur de connexion base");
// Si le visiteur a validé le formulaire
if(@$_POST["pass"]) {
   // on compare avec la liste
   $result = mysql_query("SELECT * FROM menbres");
   while ($val = mysql_fetch_array($result))
         // si le login et le pass sont OK
      if((@$_POST["login"]==$val["login"])
      && (@$_POST["pass"]==$val["pass"])) {
         // on stocke le niveau dans un cookie
         setcookie("passe6",$val["nivo"]);
         
         Header("Location: ".$_SERVER["PHP_SELF"]);
         break;
      }
}
?>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>

<?
include("_protect.php");

// Lien si identifié
if($protect<"4") { ?>
   <A href="">Déconnecter</A><br>
   <? // Liste des login/pass si niveau 1 ou 2
   if($protect<"3") { ?>
      <br><table bgcolor=#EEEEFF>
         <tr><th colspan=3 nowrap
            >Liste des mots de passe</th></tr>
         <tr bgcolor=#DDDDEE>
            <td>&nbsp;LOGIN&nbsp;</td>
            <td>&nbsp;PASSWORD&nbsp;</td>
         <td>&nbsp;</td></tr>
      <? $SQL = "SELECT * FROM menbres"
         . " WHERE nivo > " . $protect
         . " ORDER BY nivo,login";
         $result = mysql_query($SQL);
         while ($val = mysql_fetch_array($result)) { ?>
            <tr>
               <td nowrap><? echo $val["login"]; ?></td>
               <td nowrap><? echo $val["pass"]; ?></td>
               <td><? echo $nivo[$val["nivo"]-1]; ?></td>
            </tr>
      <? } ?>
      </table>
   <? }

} else { // Formulaire d'identification sinon
?>
   <form method="post" action="admin.php">
      <table><tr>
         <td>Login<br><input name="login"></td>
         <td>Password<br>
            <input type="password" name="pass"></td>
         <td><br><input type="Submit" value="Entrer"></td>
      </tr></table>
   </form>
<? } 

// Déconnexion
mysql_close();
?>

</body>
</html>
si vous avez des précision, jsui totalement débutant dans se domaine alors vous n'ézité pas a me sortir des erreurs lol

par graphistnet » 10 août 2006, 16:05

Je disais à tout hasard en ne sachant pas ce que contient le fichier en include :wink:

par zeus » 10 août 2006, 16:03

C'est pas "A tout hasard", c'est sûr.

Si tu fait un header alors que tu as déjà du HTML qui est affiché, il ne fonctionnera jamais et tu auras le type d'erreur que tu as ;)

Il ne faut pas que les entetes HTTP soient envoyées pour utiliser header, donc pas de HTML ni même un simple espace avant la 1ere balise d'ouverture PHP ;)

par graphistnet » 10 août 2006, 15:58

A tout hasard sépare ton code en deux, prends toute la partie du code avant l'include et place la en début de page avant l'entête html.

par faber8 » 10 août 2006, 15:56

Il faut ouvrir la sessoin avant de définir l'entête de la page html