Salut,

Comment creer un cookie dans une page appelee par Ajax sans que ca marque "Cannot modify header information - headers already sent" ? Existe t-il une methode miracle basée sur jQuery ou un truc du style ?
Modifié par apericube (11 Aug 2009 - 09:55)
Donc la reponse a ma question (comment creer un cookie depuis une page appelée avec Ajax) est : "On peut pas." ?

Parce que je sais que c'est possible vu que certains sites le font (la page initiale, a priori avec le Doctype, n'est pas rechargée: c'est une "sous-page" appelee avec Ajax qui cree un cookie).

Dans tous les cas ca m'aide pas...
apericube a écrit :
Donc la reponse a ma question est : "On peut pas." ?
Euh... qui a dit qu'on ne pouvait pas ?
Heyoan a écrit :
les cookies doivent être créés avant toute sortie html : concrètement avant le DOCTYPE
Qu'est-ce qui n'est pas clair dans cette phrase ?


Et sinon je me répète :
Heyoan a écrit :
En passant et comme je te le demandais déjà dans ce post, merci de passer tes sujets en [résolu].
a écrit :
Qu'est-ce qui n'est pas clair dans cette phrase ?


J'ai pas dit que c'etait pas clair, mais ca ne fait que decrire mon probleme au lieu de le resoudre ! (en plus je le savais deja, moi ce que je veux savoir c'est comment on contourne ce probleme pas comment on le decrit)

a écrit :
Euh... qui a dit qu'on ne pouvait pas ?


Ok eh bien comment fait-on? (c-a-d comment fait-on pour creer un cookie dans une page appelee avec Ajax?)
Eh bien comme je te le disais il n'y a rien de particulier. Un exemple de page appelée en ajax :
<?php
$value = 'Valeur de test';
setcookie("TestCookie", $value, time()+3600);
?>
Donc soit tu fais une sortie html avant (echo, espace avant <?php, BOM, ...) soit tu as une erreur qui génère un warning... et qui fait donc une sortie html.
Modifié par Heyoan (01 Aug 2009 - 00:28)
Ok alors en fait je viens de comprendre pourquoi j'etais persuadé qu'un output situé avant le setcookie etait hors de cause. Pour moi le mystere est total :

Sur ma page d'accueil j'ai un formulaire de login avec action="#" et un bouton submit avec onsubmit="...Chargement Ajax de la sous-page qui cree le cookie". Le passage de variable fonctionne : dans ma sous-page je peux checker la validité du login/pass dans ma BDD et afficher des liens en consequence.

Mais c'est ici que reside le mystere : un setcookie placé au tout debut de cette sous-page provoque un "headers already sent", MAIS, si je change le bouton submit en 'button' dans le form de la page principale et que je transmet mes variables en chaine de requete dans un onclick="", le cookie se cree sans probleme !!

En d'autres termes, du point de vue de ma sous-page appelee avec Ajax, les variables recues par un Submit de formulaire constituent de l'output (??) contrairement a des variables recues par une chaine de requete.

Si quelqu'un a une explication rationelle a ce phenomene malefique je suis interessé !
Voici mon probleme en live : http://balthy.com/test/index.php

Comme vous pouvez le voir ci-dessous, dans ma page de creation de cookie il n'y a aucun ouput precedant le setcookie. Pourtant j'ai un message type "headers already sent".

Voici le code de ma page de creation de cookie, cookie.php:


if ( (isset($_POST['login'])) && (isset($_POST['pass'])) ) {	
	setcookie("haha", "haha", time()+3600);
	print "Ajax Page Loaded, Setcookie executed.";
}



Et le code de ma page principale :


<!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>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<script src="jquery-1.2.6.min.js" type="text/javascript" charset="utf-8"></script>
	<script language="JavaScript" type="text/javascript">
		$(document).ready(function () {
			
			$("#con").submit(function(){
				$.ajax({
				type: "POST",
				url: "cookie.php",
				data: $(this).serialize(), //this sends the forms data to cookie.php
				success: function(msg){
					$("#toplinks").html(msg);
				}
				});
				return false; //this stops form doing its normal submit
			});
		});
	</script>
</head>
		
<body>

	<form method="post" action="#">
		Login
		<input type="text" id="login" name="login"><br>
		Pass
		<input type="password" id="pass" name="pass"><br>
		<input type="submit" value="GO">
	</form> 

	<div id="toplinks"> 
		<?php include("cookie.php"); ?>
	</div>
			
	<a href="index.php">Reset</a>

</body>
</html>
Bonjour,
apericube a écrit :
Comme vous pouvez le voir ci-dessous, dans ma page de creation de cookie il n'y a aucun ouput precedant le setcookie. Pourtant j'ai un message type "headers already sent".

Oui, dans le fichier cookie.php il n'y a pas d'output avant le setcookie. Par contre dans la page qui appelle cookie.php, il y a un output.

La fonction include ne fait que coller un morceau de code dans une autre page.
Hmm. Voyons si j'ai bien compris.

L'include("cookie.php") est executé au chargement de ma page principale index.php. A ce stade, cet include ne fait rien puisque la condition if de cookie.php n'est pas remplie. Ensuite l'utilisateur clique sur le submit button, ce qui a pour effet de charger - de nouveau - cookie.php dans un certain <div> (peu importe lequel). C'est ici et seulement ici que se produit le message d'erreur. Mais ce cookie.php, celui qui vient d'etre chargé par Ajax sur un click, n'est pas appelé par un include. Il est chargé avec Ajax !

C'est ca que je comprend pas. Si je vire l'include, la page s'affiche plus en clickant sur le lien Ajax. Pourtant cet appel Ajax n'a que faire de cet include !

Dans un autre site que j'ai fait, j'ai un <div> qui est vide. Ailleurs dans la meme page il y a un appel Ajax qui charge une sous-page dans ce <div> et ca marche sans probleme. Mais dans mon site actuel je peux pas faire ca. Je pige pas.

Dans tous les cas, mon setcookie s'execute dans une page qui n'est pas includée mais ajaxée! C'est comme ca que je vois les choses en tout cas, mais je dois surement me tromper Smiley ohwell
Tu devrais revoir les bases du PHP...

De ton code, tout ce que je vois c'est que l'include est appelé bien après le doctype, donc bien après le premier output, donc il est impossible de mettre un cookie.
Bon alors en fait ca venait de mon jQuery : J'ai mis $("#con") alors que #con correspond a rien. Dans ce bout de code pris sur le net j'ai oublié de mettre le nom de mon formulaire (notez que la page se chargeait malgré tout)

Maintenant tout marche, et.. si, Laurie-Anne, le cookie se cree. A mon avis la raison est que le setcookie n'est pas executé dans l'include, mais dans l'appel Ajax.

C'est un peu desesperant de voir que les erreurs idiotes de ce genre me font perdre beaucoup plus de temps que les erreurs de programmation ou de logique. Par ex la j'ai perdu 2 apres-midi ! Smiley sweatdrop
apericube a écrit :
Salut,
Comment creer un cookie dans une page appelee par Ajax sans que ca marque "Cannot modify header information - headers already sent" ? Existe t-il une methode miracle basée sur jQuery ou un truc du style ?


Un peut nouvelle pour me méler aux discutions mais je me demandes si tout est bien clair ?

Un Cookies peut étre créé , lu , réécrit etc ... nimporte ou dans une page HTML,du moment que c'est en javascript.
Voila un premier point qui ne me paraissait pas dit clairement.

Si certaines valeurs a mettre dans un cookies sont gérées par du PHP, c' est dans le même cookies que ces valeurs seront placées, lues etc ... le cookies unique de données lié au nom de domaine du site web. on peut avoir un cookies par domaine/repertoire. par contre le fait qu'il soit réalisé avec du javascript ou du PHP ne change rien .

Plus clair ?? Oui, si je suis tordue, je peux créer mes cookies avec du PHP et les lires avec du javascript !

Et bien sur comme il t'a été dit, si c'est le PHP qui crée ou lit ton cookies, il doit le faire (étant le serveur) avant de t'envoyer la moindre ligne de html même vide Smiley cligne
Ah ok je comprend mieux la! Bon bah je vais creer mes cookies qu'avec JS dorenavant, comme ca plus de probleme de headers already sent. MErci.
apericube a écrit :
Ah ok je comprend mieux la! Bon bah je vais creer mes cookies qu'avec JS dorenavant, comme ca plus de probleme de headers already sent. MErci.


N'oublie pas que tous les utilisateurs n'ont pas js activé, il est plus sûr pour le bon fonctionnement de ton site que tu n'utilises que php justement.
Pour moi c'est essentiel de tenir compte des "minorités", comme ceux qui utilisent IE6 par ex, parce que c'est souvent des employés dont la boite utilise IE6 ou bien des gens qui s'y connaissent tres peu en informatique. Bref ils ont generalement pas vraiment le choix.

Mais par contre quand quelqu'un choisit de desactiver deliberemment une fonction basique d'un browser, je vais surement pas me casser le bonnet pour lui! C'est son probleme si il veut se couper l'herbe sous le pied. Devrait-on faire des sites utilisables avec un ecran posé a l'envers parce que 15 personnes dans le monde ont leurs ecran a l'envers ?

Je voudrais bien savoir pourquoi ils desactivent JS deja. C'est par peur des malware?
apericube a écrit :
Je voudrais bien savoir pourquoi ils desactivent JS deja. C'est par peur des malware?
Eh bien moi je le désactive par défaut et je le remets en fonction des sites. Cela n'a rien à voir avec les malwares mais avec les scripts intrusifs du genre :
* musique automatique
* popup publicitaire
* pub en général
* bidules qui clignotent
* et tous ces machins du même acabit.

Pour ce qui est des autres : lire Pourquoi certains n'activent pas JavaScript ?
Hmm tres interessant cet article. Je crois que j'ai parlé trop vite! Comme on dit, il ne faut pas tuer la peau de la charrue avant d'avoir tourné la langue sept fois dans son oeil !