我有一个表单,当用户输入"测试"它应该创建一个cookie并使用require
函数加载模板。一旦cookie启用,它将显示模板。如果cookie过期,则需要再次输入密码。换句话说,如果密码是"测试"我想在再次询问密码之前将该模板包含在用户浏览器中12小时。
以下是我正在尝试的内容。有关cookies here
的更多信息问题是cookie的想法不起作用。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$code = $_POST["SecretCode"];
}
if( $code === "test") {
$cookie_name = "user";
$cookie_value = "Cookie";
setcookie($cookie_name, $cookie_value, time() + (1000 * 10), "/"); // 86400 = 1 day
if(isset($_COOKIE[$cookie_name])) {
require_once 'template.php';
//echo 'cookie set:'.$_COOKIE[$cookie_name];
}
}?>
<form method="post" action='<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>'>
<input name="SecretCode" type="text" required>
<button>Check password</button>
</form>
答案 0 :(得分:1)
在下一页请求之前,不会填充$_COOKIE
超全局中的Cookie值。
当您使用setcookie
时,服务器将尝试向客户端发送cookie。如果cookie在后续客户端请求中未过期,则客户端将显示该cookie。然后Php将使用此值填充$_COOKIE
超全局。
换句话说:setcookie('foo', 'bar', etc)
不会立即填充$_COOKIE['foo']
。
您目前正在嵌套模板调用,如下所示:
if($code === "test") {
if(isset($_COOKIE[$cookie_name])) {
require_once 'template.php';
}
}
这要求您的秘密是“测试”(来自表单帖子)并且$_COOKIE['user']
已设置。因此,除非您在设置了cookie之后提交了具有正确值的表单(至少两次成功的表单提交和验证),否则您的模板将不会被包含在内。
如果你在setcookie之后重定向,那么你可以依赖$_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>
答案 1 :(得分:1)
这也有效:
<?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>