Erreur avec setcookie() et header()

Invité
Invité n'ayant pas de compte PHPfrance

10 août 2006, 15:22

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 août 2006, 15:45

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 184 Messages

10 août 2006, 15:51

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?
Image

Invité
Invité n'ayant pas de compte PHPfrance

10 août 2006, 15:52

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

Invité
Invité n'ayant pas de compte PHPfrance

10 août 2006, 15:53

ouai c'est tout ce qu'il y a hormi l'entete en html c'est tous !

Eléphanteau du PHP | 27 Messages

10 août 2006, 15:56

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

Eléphant du PHP | 184 Messages

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 184 Messages

10 août 2006, 16:05

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

Invité
Invité n'ayant pas de compte PHPfrance

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

Invité
Invité n'ayant pas de compte PHPfrance

10 août 2006, 16:45

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

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

Eléphant du PHP | 184 Messages

10 août 2006, 16:47

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

Invité
Invité n'ayant pas de compte PHPfrance

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

Invité
Invité n'ayant pas de compte PHPfrance

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 ??

Invité
Invité n'ayant pas de compte PHPfrance

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