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

Php 将输出发送到浏览器后设置cookie,php,cookies,Php,Cookies,有没有一种方法可以在html输出后设置cookie?根据PHP手册,setcookie()应在输出前设置 我的投票系统需要它,在成功的Mysql查询后将设置cookie。我在一个文件中创建了它。否。Cookie在标题中发送,因此必须在输出正文开始之前进行设置 但是,您可以使用PHPs内置缓冲,这样在脚本完全执行完毕之前,它实际上不会生成任何输出 ob_start是您想要的。您可以使用输出缓冲区,以便在脚本顶部添加ob_start(),这将创建一个缓冲区,然后您可以设置cookie,然后结束缓冲区

有没有一种方法可以在html输出后设置cookie?根据PHP手册,setcookie()应在输出前设置


我的投票系统需要它,在成功的Mysql查询后将设置cookie。我在一个文件中创建了它。

否。Cookie在标题中发送,因此必须在输出正文开始之前进行设置

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


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

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

在http头中设置cookie。如果您要做的是在投票中设置cookie,那么您需要执行标题('Location:…')重定向,或者您可以使用一个小iframe,在其中进行ajax调用,执行相同的操作。

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

我不知道PHP是如何处理的,但是如果我不得不猜测的话,我会说给定PHP脚本的输出可能由服务器(通常是Apache)缓冲,直到脚本完成,然后服务器在PHP脚本完成执行后写入响应。如果是这种情况,那么您应该能够随时设置cookies。如果不是,那么你就不能

我建议简单地测试一下,看看会发生什么。编写一个PHP脚本,在cookie执行的最后设置cookie,通过浏览器访问cookie,然后检查cookie是否已实际设置。

您可以使用


Cookie可以在客户端的JavaScript中设置-有关示例,请参阅此链接:

有没有一种方法可以在html输出后设置cookie

从技术上讲,没有。如果要设置cookie,则需要确保到目前为止没有向浏览器发送任何输出

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

那是对的,否则就不行了。所以我甚至会说必须,而不仅仅是应该

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

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

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

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

启用输出缓冲后,程序仍然可以“输出”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>


脚本完成后,输出缓冲区将自动发送到浏览器,因此您无需关心更多内容,其余部分将自动工作。

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

echo ('<img src="http://example.com/mysetcookie.php?uid='.$userId.'">');
echo(“”);
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;
?>


不,这是一个标题,但是我不明白为什么你不能修改代码来适应它。如果你按照我的期望去做的话,输出缓冲将不会给你带来好处(有一个表单允许该人投票,然后想要设置一个cookie来反映该人的投票结果)。@Dagon,我将尝试将php代码移到html输出上方。如果这只是一个计数脚本,那么就没有问题了——只需使用mysql执行任何需要的操作,然后设置cookie。如果使用jquery“go”到某个php文件并在该文件中设置cookie呢?不需要
ob_end_flush()
,是吗?@hakre将两者都包括在内通常是一种很好的编码实践。清晰度更好。此外,在使用多个嵌套ob_start()时necessary@footy:如果使用嵌套缓冲区,则
setcookie
不会给出任何错误。那么额外的
ob_start
将是多余的。清晰性确实更好,但将毫无意义的语句放入代码则相反。否则,脚本将生成“headers ready sent error”。我的mysql查询位于html元素中,这就是SetCookie无法工作的原因。我更新了答案中的代码示例,以说明它如何工作。我将尝试一下。顺便说一句,我正在使用这个教程。。。出于某种原因,他在没有ob_start的情况下使用了setcookies()。有些服务器自动启用了输出缓冲。那么您就不需要调用
ob_start()。为什么我需要一个标题位置重定向?我以为你在尝试使用ajax进行投票,但还想在同一个脚本中设置cookie。如果不是这样的话,忽略这个。。。您所需要做的就是在进行任何输出之前进行处理。不需要输出缓冲——一旦返回html,输出就会启动。只要在输出之前调用setCookie,就不需要输出缓冲。输出html后没有理由使用setCookie,是吗?
<?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;
?>