erreur de cookie mais ou ?

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 de cookie mais ou ?

par laurentg2003 » 01 déc. 2006, 14:28

Ok ça j'avais compris :wink:
en fait j'ai essayé toute les solutions et ça marchait pas et j'ai tout remis comme au depart.
Et la ça marche ,il devait y avoir un espace donc.Sauf si mon serveur est hanté :lol:
Enfin merci :wink:
Et je marque pas résolu vu que c'etait pas mon topic

par Ryle » 01 déc. 2006, 14:07

Chuis pas sur de tout saisir à ta question :)

L'objectif, c'est qu'il n'y ai rien d'envoyé au navigateur avant l'appel au header :
<?php // tout première ligne de ton code

... // ici, pas de print, de echo ou de "?>...<?php", sinon tu envoi un flux au navigateur ce qui empêchera le header de fonctionner

header(...);
?>
Après le header, tu peux y aller, tant que tu veux... ;) 
Lorsque tu utilises un include(), require(), etc. c'est comme si tu plaçais le code à l'endroit où à lieu l'inclusion :
fichier_1.php :
<?php

  include("fichier_2.php");

  header(...);
?>

fichier_2.php : 
<?php
  $toto = "xxx";
?>

revient au même que 
<?php

  ?><?php
    $toto = "xxx";
  ?><?php

  header(...);
?>
Donc si dans le fichier inclus, tu as un espace (ou un retour à la ligne) au début ou à la fin du fichier include, après le "?>" tu obtiendrais ceci :
<?php

  ?><?php
    $toto = "xxx";
  ?> <?php // et du coup ici tu envoi du code au navigateur, en l'occurence un espace, et empêche le header de fonctionner :)

  header(...);
?>
C'est y plus clair ?

par laurentg2003 » 01 déc. 2006, 13:12

Il n'y a absolument rien avant aprés le dernier ?> il y a bien sur une autoroute. il faut mettre le ?> tout a fait en bas à droite? :roll:

par Ryle » 01 déc. 2006, 11:38

Même ceci était correcte :
<?php 

define('NOM',"blabla");  
define('PASSE',"code");  

define('SERVEUR',"localhost");  
define('BASE',"base");

?>
ce qu'il faut c'est qu'il n'y ait rien avant le "<?php" et rien après le "?>" : ni espace, ni retour à la ligne, ni commentaire, ni rien en fait :)
et naturellement aucun print ou echo entre les deux ;)

par laurentg2003 » 30 nov. 2006, 16:49

<?php
define('NOM',"blabla"); 
define('PASSE',"code"); 
define('SERVEUR',"localhost"); 
define('BASE',"base");?>  
Si je comprend bien ça c'est correct alors :?:

par Ryle » 30 nov. 2006, 10:35

Et tu n'as absolument pas d'espace ou de retour à la ligne juste après le "?>" ?? :)

dans le message d'erreur il te t'indique (outre le "headers already sent by") l'endroit où le header a été envoyé :
"(output started at /home/local/apache/htdocs/sites/t/www.jmb.com/Connect.php:6)"

D'où mon acharnement pour cette ligne du fichier ;)

par laurentg2003 » 29 nov. 2006, 19:04

<?php
define('NOM',"blabla");
define('PASSE',"code");
define('SERVEUR',"localhost");
define('BASE',"base");
?>
C'est la ligne 6
mais ce qui m'a fait penser que c'etait lié au include c'est que qd j'affiche directement ce fichier ça marche sans rien modifier

par Ryle » 29 nov. 2006, 18:33

Et le contenu de Connect.php ? (genre à la ligne 6 :))

par laurentg2003 » 29 nov. 2006, 18:30

<?php
session_start();
require ("Connect.php");
// on vérifie toujours qu'il s'agit d'un membre qui est connecté
if (!isset($login_user)) {
    // si ce n'est pas le cas, on le redirige vers l'accueil
    header ('Location: login.php');
    exit();
}

// on teste si le formulaire a bien été soumis
if (isset($_POST['go']) && $_POST['go'] == 'Envoyer') {
    if (empty($_POST['destinataire']) || empty($_POST['titre']) || empty($_POST['message'])) {
        $erreur = 'Au moins un des champs est vide.';
    }
    else {
	
        $base = mysql_connect (SERVEUR,NOM,PASSE); 
        mysql_select_db (BASE, $base);
        
        // si tout a été bien rempli, on insère le message dans notre table SQL
        $sql = 'INSERT INTO messages VALUES("", "'.$id.'", "'.$_POST['destinataire'].'", "'.date("Y-m-d H:i:s").'", "'.addslashes($_POST['titre']).'", "'.addslashes($_POST['message']).'")';
        mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

        mysql_close();

        header('Location: bienvenue.php');
        exit();
    }
}
?>

<html>
<head>
<title>Espace membre</title>
</head>

<body>
<a href="membre.php">Retour à l'accueil</a><br /><br />
Envoyer un message :<br /><br />

<?php

$base = mysql_connect (SERVEUR,NOM,PASSE); 
mysql_select_db (BASE, $base);

// on prépare une requete SQL selectionnant tous les login des membres du site en prenant soin de ne pas selectionner notre propre login, le tout, servant à alimenter le menu déroulant spécifiant le destinataire du message
$sql = 'SELECT user.login_user as nom_destinataire,user.id as id_destinataire FROM user WHERE id <> "'.$_SESSION['id'].'" ORDER BY login_user ASC';
// on lance notre requete SQL
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$nb = mysql_num_rows ($req);

if ($nb == 0) {
    // si aucun membre n'a été trouvé, on affiche tout simplement aucun formulaire
    echo 'Vous êtes le seul membre inscrit.';
}
else {
    // si au moins un membre qui n'est pas nous même a été trouvé, on affiche le formulaire d'envoie de message
    ?>
    <form action="envoyer.php" method="post">
    Pour : <select name="destinataire">
    <?php
    // on alimente le menu déroulant avec les login des différents membres du site
    while ($data = mysql_fetch_array($req)) {
        echo '<option value="' , $data['id_destinataire'] , '">' , stripslashes(htmlentities(trim($data['nom_destinataire']))) , '</option>';
    }
    ?>
    </select><br />
    Titre : <input type="text" name="titre" value="<?php if (isset($_POST['titre'])) echo stripslashes(htmlentities(trim($_POST['titre']))); ?>"><br />
    Message : <textarea name="message"><?php if (isset($_POST['message'])) echo stripslashes(htmlentities(trim($_POST['message']))); ?></textarea><br />
    <input type="submit" name="go" value="Envoyer">
    </form>
    <?php
}
mysql_free_result($req);
mysql_close();
?>
</select>

<br /><br /><a href="deconnexion.php">Déconnexion</a>
<?php
// si une erreur est survenue lors de la soumission du formulaire, on l'affiche
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
</body>
</html>
Voila ,si cependant c'est pas lié à l'include et bien j'avale mon chapeau :lol:

par Ryle » 29 nov. 2006, 18:23

oui c'est peut etre ça mais je viens exprés de faire un script
en plaçant un include avant setcokie et le meme avant un header et:
Warning: Cannot modify header information - headers already sent by (output started at /home/local/apache/htdocs/sites/t/www.jmb.com/Connect.php:6)
in /home/local/apache/htdocs/sites/t/www.jmb.com/envoyer.php on line 26
Vous en pensez quoi? :wink:
J'en pense surtout que si tu ne nous donne pas le code et si tu ne nous dis pas pour le ou lesquels tu as ce message, on va pas pouvoir en penser grand chose ;)

Sachant que normalement, le include est exécuté comme s'il faisait partie du script qui l'appel (en gros on copie le code à l'endroit ou est fait l'include et ça marche pareil), il n'y a donc aucune raison pour que le include() influe sur le header, le cookie ou la session (qui nécessitent tous 3 qu'aucune entête n'aient été envoyés)
En revanche, suffit qu'il y ait un espace, un retour à la ligne ou autre en dehors des balises <?php ?> (souvent constaté en début ou fin de fichier :)), voire un echo, un print, etc. pour que l'entête soit envoyé...

par laurentg2003 » 29 nov. 2006, 18:14

La théorie, c'est quand on sait tout faire, mais que rien ne fonctionne.
La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
Ici nous avons réussi à réunir théorie et pratique : rien ne fonctionne et personne ne sait pourquoi...
:lol: trop bien dit

par laurentg2003 » 29 nov. 2006, 18:10

oui c'est peut etre ça mais je viens exprés de faire un script
en plaçant un include avant setcokie et le meme avant un header et:
Warning: Cannot modify header information - headers already sent by (output started at /home/local/apache/htdocs/sites/t/www.jmb.com/Connect.php:6)
in /home/local/apache/htdocs/sites/t/www.jmb.com/envoyer.php on line 26
Vous en pensez quoi? :wink:

par Ryle » 29 nov. 2006, 17:18

Ligne 59 tu as envoyé des en-têtes avec la fonction header(). Désactive-la pour tester si c'est ça ;)
Ca parait effectivement assez évident... on a tellement l'habitude de chercher l'espace ou le retour à la ligne qui est envoyé au navigateur et qui empêche le header() de fonctionner, qu'on en oublie que la fonction header() envoi justement elle aussi une entête au navigateur... :)

par Invité » 29 nov. 2006, 17:11

Dans mes scripts les includes placés avant setcookie provoquent le message d"erreur ci dessus et je ne dois pas etre le seul vu que j'ai epluché la doc concernant ce sujet sur google et la doc ne manque pas...
mais c'est vrai qu'un header avant setcookie peut provoquer la méme chose

par Darth Killer » 29 nov. 2006, 12:50

Moi je vais des includes à gogo, les set-cookies marchent sans aucun blèmes. Par contre jamais je n'ai appelé la fonction header() avant la fonction setcookie() (on exclus le header('Set-cookie: '); hein ?)