有没有办法在html输出后设置cookie?根据PHP手册,setcookie()应该在输出之前设置。
我需要它用于我的投票系统,其中在成功的Mysql查询之后将设置cookie。我把它放在一个文件中。
答案 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_start
Docs函数,它将启动输出缓冲。
启用输出缓冲后,您的程序仍然可以“输出”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;
?>