输出发送到浏览器后设置cookie

时间:2011-09-18 06:55:31

标签: php cookies

有没有办法在html输出后设置cookie?根据PHP手册,setcookie()应该在输出之前设置

我需要它用于我的投票系统,其中在成功的Mysql查询之后将设置cookie。我把它放在一个文件中。

8 个答案:

答案 0 :(得分:10)

您可以使用输出缓冲区,因此在脚本的顶部添加ob_start(),这将创建一个缓冲区,然后您可以设置cookie然后结束缓冲区并刷新到浏览器。

ob_start();
/* set cookie */
ob_end_flush();

答案 1 :(得分:5)

  

有没有办法在html输出后设置cookie?

技术上没有。如果您想设置cookie,您需要确保到目前为止没有输出发送到浏览器。

  

根据PHP手册setcookie()应该在输出之前设置。

这是正确的,否则它将无法正常工作。所以我甚至会说必须,不仅应该

  

我的投票系统需要它,其中一个cookie将在成功的mysql查询后设置。

一个成功的mysql查询就不会创建任何输出。如果启用了错误报告,则只有失败的mysql查询。所以我想知道你是否真的遇到了一个具体的问题。

mysql查询本身不应该阻止您使用setcookie

如果您在使用setcookie之前已经完成HTML输出,则需要找到HTML输出开始的位置。在该行上方放置ob_startDocs函数,它将启动输出缓冲。

启用输出缓冲后,您的程序仍然可以“输出”HTML,但不会立即发送。那么你应该可以毫无问题地致电setcookie

<?php ob_start(); ?>
<html><body>
<?php 
  $result = mysql_run_query($query);
  echo '<h1>Your Voting Results</h1>';
  output_voting_result($result);
  set_cookie('vote', $result['id']);
?>
</body></html>

当您的脚本完成时,输出缓冲区将自动发送到浏览器,因此您无需关心更多内容,其余内容将自动生效。

答案 2 :(得分:4)

可以在客户端使用JavaScript设置Cookie - 请参阅此链接以获取示例:http://www.w3schools.com/js/js_cookies.asp

答案 3 :(得分:3)

没有。 Cookie会在标题中发送,因此必须在输出正文开始之前设置它们。

但是,您可以使用PHP内置缓冲,因此在脚本完全执行完毕之前,它实际上不会生成任何输出。

ob_start是您想要的function

答案 4 :(得分:2)

您可以使用output buffering

ob_start();

// send output
// set cookie

ob_end_flush();

答案 5 :(得分:1)

cookie在http标头中设置。如果你想要做的是在投票时设置cookie,那么你需要做一个标题('Location:...')重定向,或者你可以有一个小的iframe,你做一个ajax调用做同样的的事情。

答案 6 :(得分:1)

Cookie作为响应标头的一部分发送到浏览器。这意味着必须在服务器开始将其响应写入正在处理的请求之前设置(以便服务器可以在响应上指定正确的标头)。

我不知道在PHP中如何处理它的具体细节,但如果我不得不猜测我会说服务器(通常是Apache)可能会缓冲给定PHP脚本的输出,直到脚本完成为止,然后服务器在PHP脚本完成执行后写入响应。如果是这种情况,那么您应该可以随时设置cookie。如果不是,那么你将无法做到。

我建议只是测试一下,看看会发生什么。编写一个PHP脚本,在执行结束时设置cookie,通过浏览器访问它,然后检查cookie是否实际设置。

答案 7 :(得分:0)

如果由于某种原因您无法缓冲输出,您可以在发送输出后通过在当前页面上显示访问设置cookie的脚本的图像来设置cookie。

echo ('<img src="http://example.com/mysetcookie.php?uid='.$userId.'">');

mysetcookie.php

<?php
setcookie('cookie-name',$_REQUEST['uid']);
//output an image - this is a one-pixel clear image
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');     
exit;
?>