Php 在表单密码正确时设置cookies

Php 在表单密码正确时设置cookies,php,cookies,setcookie,Php,Cookies,Setcookie,我有一个表单,当用户输入“Test”时,它应该创建一个cookie,并使用require函数加载模板。一旦启用cookie,它就会显示模板。如果cookie过期,则需要再次输入密码。换句话说,如果密码是“Test”,我希望在再次请求密码之前,在用户浏览器中包含该模板12小时 下面是我正在尝试的。更多关于饼干的信息 问题是cookie的想法不起作用 在下一页请求之前,$\u cookie超全局中的cookie值不会被填充 使用setcookie时,服务器将尝试向客户端发送cookie。如果coo

我有一个表单,当用户输入“Test”时,它应该创建一个cookie,并使用
require
函数加载模板。一旦启用cookie,它就会显示模板。如果cookie过期,则需要再次输入密码。换句话说,如果密码是“Test”,我希望在再次请求密码之前,在用户浏览器中包含该模板12小时

下面是我正在尝试的。更多关于饼干的信息

问题是cookie的想法不起作用



在下一页请求之前,
$\u cookie
超全局中的cookie值不会被填充

使用
setcookie
时,服务器将尝试向客户端发送cookie。如果cookie在后续客户端请求时未过期,则客户端将呈现该cookie。然后,Php将使用此值填充
$\u COOKIE
超全局

换句话说:
setcookie('foo','bar'等)
不会立即填充
$\ucookie['foo']

您当前嵌套的模板调用如下所示:

if($code === "test") {
    if(isset($_COOKIE[$cookie_name])) {
        require_once 'template.php';
    }
}
这要求您的秘密是“测试”(来自表单帖子),并且设置了
$\u COOKIE['user']
。因此,除非在设置cookie(至少两次成功的表单提交和验证)后提交具有正确值的表单,否则模板将不会被包括在内

如果在setcookie之后重定向,则可以更多地依赖
$\u COOKIE
。请注意,Cookie可能会被欺骗:

<?php

$cookie_name   = "user";
$cookie_value  = "Cookie";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $secret = isset($_POST['secret']) ? $_POST['secret'] : null;
    $forget = isset($_POST['forget']) ? $_POST['forget'] : null;

    if($secret === "test") {
        $cookie_expiry = time() + (24*60*60); // +1 day
        setcookie($cookie_name, $cookie_value, $cookie_expiry , "/");
        // Redirect here.
        exit;
    }
    if($forget) {
        $cookie_expiry = time() - (24*60*60); // -1 day
        setcookie($cookie_name, '', $cookie_expiry , "/");
        // Redirect here.
        exit;
    }
}
if(isset($_COOKIE[$cookie_name])) {
    echo 'Cookie set.';
} 
?>
<form method="post" action='<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>'>
    <label for="secret">Secret:</label>
    <input name="secret" type="text" required>
    <input type="submit" value="Check in">
</form>
<form method="post">
    <input type="submit" name="forget" value="Forget me">
</form>

这也将有助于:

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$cookieName = 'User';

if (isset($_POST['SecretCode']) && ($_POST['SecretCode'] == 'test')) {
  echo 'Password correct.<br>';
  setcookie($cookieName,'Cookie',time()+86400,'/'); // 86400 = 1 day
  echo 'Cookie was set.<br>';
  echo 'Require template here.<br>';
}  elseif (isset($_COOKIE[$cookieName])) {
  echo 'Require template here as well.<br>';
  echo 'Cookie value: ['.$_COOKIE[$cookieName].']<br>';
}

?>

<form method="post">
<input name="SecretCode" type="text" required>
<button>Check password</button>
</form>

检查密码

在php尝试设置cookie之前,是否有任何html输出?我遇到的问题是cookie的想法不起作用。如果你评论所有与cookies有关的东西,并尝试它的工作原理,你就会有一个想法。我想做的就是弄清楚。用户将输入密码,如果密码正确,模板将加载到其浏览器中。我只想实现Cookie。检查php错误日志你根本帮不了我我问过在
setcookie
之前是否有html-没有回答,所以我让你检查错误日志。在任何html输出之后使用
setcookie
都会导致错误有一个问题。我需要提交3次密码才能工作。当我删除浏览器的缓存cookies时,我不明白为什么你需要提交三次密码?你打对了吗?缓存和cookie是两种不同的东西。您使用的是哪种浏览器?@Progrock:我听从了您的建议。@KIKOSoftware,回音线对我来说仍然在setcookie的上方。我也不知道,有时它会进行1次提交,有时需要单击两下才能加载模板@KIKOSoftware。事实上,当我按下回车键时,需要两次。当我点击按钮时,它会正常进行
<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$cookieName = 'User';

if (isset($_POST['SecretCode']) && ($_POST['SecretCode'] == 'test')) {
  echo 'Password correct.<br>';
  setcookie($cookieName,'Cookie',time()+86400,'/'); // 86400 = 1 day
  echo 'Cookie was set.<br>';
  echo 'Require template here.<br>';
}  elseif (isset($_COOKIE[$cookieName])) {
  echo 'Require template here as well.<br>';
  echo 'Cookie value: ['.$_COOKIE[$cookieName].']<br>';
}

?>

<form method="post">
<input name="SecretCode" type="text" required>
<button>Check password</button>
</form>