Page 1 sur 2

Erreur avec setcookie() et header()

Posté : 10 août 2006, 15:22
par Invité
bonjour a tous,

j'essaye de sécurise mes pages et pour ca j'utilise les session php.

mais j'ai des erreurs dont je ne trouve pas la cause !
<?
// 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('xxxx','xxxx','xxxx') or die ("erreur de connexion");
mysql_select_db('xxxxx',$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"]);   // erreur ligne 29
         mysql_close();
         Header("Location: ".$_SERVER["PHP_SELF"]); // erreur ligne 31
         break;
      }
}

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(); //erreur ligne 77
?>

il me marque les erreur suivante :


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

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

Warning: mysql_close(): no MySQL-Link resource supplied in admin.php on line 77

je ne comprend pas les erreurs énoncé, si quelqu'un peut m'aider !

Merci

Posté : 10 août 2006, 15:45
par zeus
Déjà, tu mets 2 mysql_close() dans ton code, ça fait un de trop

Ensuite, il est possible que ça soit cette erreur qui engendre les autres ;)

Posté : 10 août 2006, 15:51
par graphistnet
Je pense que la partie avant l'include n'est pas à la bonne place dans la page.
As tu d'autres éléments sur cette page ou est-ce la totalité du code source?

Posté : 10 août 2006, 15:52
par Invité
exact, j'avais pas vu cet erreur merci,
mais celle-ci n'a pas de relation avec les 2autres puisqu'elles réaparaissent.

donc mon probleme n'est pas résolu...

Posté : 10 août 2006, 15:53
par Invité
ouai c'est tout ce qu'il y a hormi l'entete en html c'est tous !

Posté : 10 août 2006, 15:56
par faber8
Il faut ouvrir la sessoin avant de définir l'entête de la page html

Posté : 10 août 2006, 15:58
par graphistnet
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.

Posté : 10 août 2006, 16:03
par zeus
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 ;)

Posté : 10 août 2006, 16:05
par graphistnet
Je disais à tout hasard en ne sachant pas ce que contient le fichier en include :wink:

Posté : 10 août 2006, 16:40
par Invité
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

Posté : 10 août 2006, 16:45
par Invité
les lignes a erreur sont :
setcookie("passe6",$val["nivo"]); 

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

Posté : 10 août 2006, 16:47
par graphistnet
L'erreur est-elle identique? il faudrait afficher le message d'erreur

Posté : 10 août 2006, 16:52
par Invité
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

Posté : 11 août 2006, 10:18
par Invité
personne ne peut m'aider ?
quelle est ce message d'erreur ? que faut-il que je fasse pour que ma session fontionne ??

Posté : 11 août 2006, 10:51
par Invité
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