【问题标题】:Set a cookie after output has been send to browser将输出发送到浏览器后设置 cookie
【发布时间】:2011-09-18 06:55:31
【问题描述】:

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

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

【问题讨论】:

  • 不,它是一个标题,但我不明白为什么你不能改变你的代码来适应它
  • 输出缓冲在这里不会使您受益,如果您正在做我期望的事情(有一个允许该人投票的表格,然后想要设置一个反映该人的 cookie投票。)
  • @Dagon,我会尝试将 php 代码移到 html 输出上方。
  • 如果这只是一个计数脚本,那么没有问题——只要用 mysql 做任何你需要做的事情,然后 setCookie。
  • 如果使用 jquery "go" 到某个 php 文件并在该文件中设置 cookie 会怎样?

标签: php cookies


【解决方案1】:

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

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

【讨论】:

  • 不需要ob_end_flush();吧?
  • @hakre 通常将两者都包含在内是一种很好的编码实践。清晰度更好。此外,在使用多个嵌套 ob_start() 时,这将是必要的
  • @footy:如果使用嵌套缓冲区,setcookie 不会给出任何错误。那么额外的ob_start 将是多余的。清晰确实更好,但将语句放入没有意义的代码中则相反。
【解决方案2】:

有没有办法可以在 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>

当你的脚本完成时,输出缓冲区会自动发送到浏览器,所以你不需要关心太多,剩下的会自动工作。

【讨论】:

  • 我的 mysql 查询在一个 html 元素中, 这就是 setcookies 不起作用的原因。
  • 我更新了答案中的代码示例以显示它是如何工作的。
  • 我试试看。顺便说一句,我正在使用本教程devarticles.com/c/a/MySQL/…...出于某种原因,他使用 setcookies() 没有 ob_start..
  • 一些服务器自动启用了输出缓冲。那你就不用打电话ob_start();了。
【解决方案3】:

您可以使用output buffering

ob_start();

// send output
// set cookie

ob_end_flush();

【讨论】:

    【解决方案4】:

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

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

    ob_start 是你想要的function。

    【讨论】:

      【解决方案5】:

      可以在客户端的 JavaScript 中设置 Cookie - 示例请参见此链接:http://www.w3schools.com/js/js_cookies.asp

      【讨论】:

        【解决方案6】:

        cookie 在 http 标头中设置。如果您要做的是在投票中设置 cookie,那么您要么需要执行 header('Location:...') 重定向,要么您可以有一个小的 iframe,您可以在其中进行相同的 ajax 调用东西。

        【讨论】:

        • 为什么需要标头位置重定向?
        • 我以为您正在尝试使用 ajax 进行投票,但还想在同一个脚本中设置一个 cookie。如果不是这种情况,请忽略这一点……您需要做的就是在进行任何输出之前进行处理。不需要输出缓冲——您的输出将在您返回 html 后开始。
        • 只要在输出前调用 setCookie 即可。输出html后没有理由有setCookie吗?
        【解决方案7】:

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

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

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

        【讨论】:

        • 不会,脚本会产生“headers already sent error”
        【解决方案8】:

        如果由于某种原因无法缓冲输出,您可以在发送输出后设置 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;
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-19
          • 2014-04-09
          • 2014-05-07
          • 1970-01-01
          • 2011-08-07
          • 2019-04-17
          • 2015-07-06
          相关资源
          最近更新 更多