【问题标题】:Set cookie after output without ob_start在没有 ob_start 的情况下输出后设置 cookie
【发布时间】:2012-09-22 01:04:15
【问题描述】:

我猜不是,但是有没有办法在 PHP 中设置一个 cookie 而不必在输出的开头放置 ob_start()

我的问题是,我正在开发一个类,其中需要设置一个 cookie。现在我不能告诉使用它的人“你必须在进行任何输出之前创建一个新的类实例”,因为那会很蹩脚。那我能不能把它搞定?

【问题讨论】:

  • 为什么在输出前设置cookie会很烂?
  • 如果是你的代码,这样做并不差劲,只是因为他想使用你的类而强迫另一个开发人员这样做是差劲的。
  • 如果您记录该类负责发送 HTTP 标头(如 Set-Cookie),那么说在发送任何输出之前需要使用它并没有错。例如,这正是 setcookie 文档所说的内容。

标签: php cookies setcookie ob-start


【解决方案1】:

Headers already sent by PHP

此处列出的非专业解决方法适用。具体来说:

<META HTTP-EQUIV="Set-Cookie" 
CONTENT="cookievalue=xy;expires=Friday, 14-Dec-12 12:12:12 GMT; path=/">

或使用 并设置document.cookie

【讨论】:

    【解决方案2】:

    你不能。 Cookie 是作为标头的一部分发送的,因此如果您已经发送了正文,则为时已晚。输出缓冲就是解决方案。

    也许您可以改用会话变量。

    【讨论】:

    • 我可能只会在无法设置 cookie 的情况下这样做,所以谢谢,这也是一个好建议 :)
    【解决方案3】:

    这是我的工作区,对我来说效果很好。

    // Force set cookie now
    $_COOKIE['ref_url'] = $_SERVER['HTTP_REFERER'];
    
    // Set cookie after refresh site
    setcookie('ref_url', $_SERVER['HTTP_REFERER'], Affiliate::$cookieTime);
    
    // Diplay $_COOKIE
    var_dump($_COOKIE['ref_url']);
    

    【讨论】:

    • $_SERVER['HTTP_REFERER'] 有时为空,因此在使用之前先对其进行测试。 $url_referrer = empty($_SERVER['HTTP_REFERER'])?'':$_SERVER['HTTP_REFERER'];
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2019-01-31
    • 2020-11-11
    • 1970-01-01
    • 2016-03-20
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多