【问题标题】:PHP setcookie doesn't work after "echo" on production server (it does work on localhost)PHP setcookie 在生产服务器上的“echo”之后不起作用(它在 localhost 上起作用)
【发布时间】:2020-08-08 12:01:08
【问题描述】:

我的网站有一个相当不错的类似系统。只要用户点击❤️,我的script.js 就会向我的 PHP 服务器发送一个包含博客文章路径名的 Ajax,该服务器会检查用户是否已经喜欢它(如果是,则有相应的 cookie)。如果没有,它会读取我的 like.json 的内容并查找帖子的计数,然后将其加 1。之后,服务器会为用户提供一个 cookie,表示他已经喜欢过这篇帖子。

现在我告诉你:在我的本地主机上一切正常。但是当我将所有内容上传到生产服务器时,它无法设置“已经喜欢”的 cookie。

首先,让我们看看所有的代码文件:

script.js 发送 Ajax:

var url = window.location.pathname;

$.ajax({
    type: "POST",
    url: 'like.php',
    data: { "liked": url },
    success: function(response){
        
    }
});

这是 PHP 文件:

<?php

setcookie('why-doesnt-work-anything', 'no-idea', time() + (86400 * 30), NULL, NULL, TRUE, NULL);

$url = $_POST['liked'];

$filename = "like.json";
$fd = fopen ($filename, "r");
$contents = fread ($fd, filesize($filename));
fclose ($fd);

$originalcontents = $contents;
$contents = json_decode($contents);
$contents->$url = $contents->$url + 1;

setcookie('nothing-works', 'no-clue', time() + (86400 * 30), NULL, NULL, TRUE, NULL);

echo $contents->$url;

setcookie('doesnt-work', 'i-dont-know-why', time() + (86400 * 30), NULL, NULL, TRUE, NULL);

$contents = json_encode($contents);

$urls = $url;

if($_COOKIE['like'] != undefined && $_COOKIE['like'] != ''){
    $urls = $url . ',' . $_COOKIE['like'];
}

if(in_array($url,explode(',',$_COOKIE['like']))){
    $urls = $_COOKIE['like'];
    $contents = $originalcontents;
}

setcookie('like', $urls, time() + (86400 * 30), NULL, NULL, TRUE, NULL); // the actual liked cookie

$fp = fopen ($filename, "w");
fwrite ($fp,$contents);
fclose ($fp);

?>

这是“令人兴奋”的部分:一般来说,这与 cookie 无关。如您所见,我创建了 3 个测试 cookie。请记住:在我的本地主机上,一切正常。但是在生产服务器上,所有设置 cookie 的尝试在 echo 行之后都会失败。前 2 个 cookie 有效,但第 3 个无效。

我认为这不是我的托管服务提供商 (1&1) 的错误。是因为PHP版本不同吗?或者是什么问题?

感谢您的帮助!

【问题讨论】:

  • 不同的配置。如果您的本地构建自动启用了输出缓冲,那么您可以随时发送像 Cookie 这样的标头。但是使用 cookie 来判断某人是否已经喜欢某件事是一个坏主意 - cookie 可以被清除,他们可以再次“喜欢”它。
  • 在你做任何与内容输出相关的事情之前,最好(不管输出缓冲开/关)构造你的代码来处理所有与标题相关的事情。那么您不必担心环境是否启用了缓冲。
  • @NiettheDarkAbsol 是的,没错。但是由于该网站没有任何注册功能,因此无法阻止多次喜欢。但是谁不想收到很多赞... ??????????
  • @IncredibleHat 感谢您的建议!

标签: php cookies echo setcookie


【解决方案1】:

一旦您回显某些内容,您就不能再设置 cookie,除非您的环境中默认启用了输出缓冲;你的本地主机上可能是什么情况。

documentation 说:

与其他标头一样,必须在脚本的任何输出之前发送 cookie(这是协议限制)。这要求您在任何输出之前调用此函数,包括和标记以及任何空格。

还有:

注意: 您可以使用输出缓冲在调用此函数之前发送输出,所有输出到浏览器的开销都在服务器中缓冲,直到您发送它。您可以通过在脚本中调用ob_start()ob_end_flush() 来完成此操作,或者在您的php.ini 或服务器配置文件中设置output_buffering 配置指令。

PS:您还必须考虑 Niet the Dark Absol 关于在这种情况下使用 cookie 的评论。

【讨论】:

  • 谢谢!我以前从未听说过,所以感谢您的教导?
猜你喜欢
  • 2015-09-06
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2021-11-24
  • 2012-03-06
  • 2019-10-09
  • 2020-05-20
相关资源
最近更新 更多