【发布时间】: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