在 PHP 代码块之间有条件地嵌入 html + 设置 cookie
Conditional emebed html between PHP code blocks + setting cookies
几周前我开始研究 PHP,我对 PHP 代码块和设置 cookie 之间的条件嵌入 HTML 有点困惑。我想要做的是一个简单的代码来检查您的姓名、密码和 e-mail,设置 cookie(如果它们有效);当您已经登录后,您应该会看到 "log out" 按钮。所以,我的代码:
<?php
if (($_POST['name'] == 'admin') and ($_POST['pass'] == 'admin') and ($_POST['mail'] == 'admin@gmail.com')) {
setcookie("Test","Value");
echo "Success!!! <br/>";
}
if ($_POST['logout']) {
setcookie("Test", "", time() - 3600);
echo "Goodbye!";
}
?>
<?php if(isset($_COOKIE['Test'])) :
?>
<input type="submit" value="logout"/><br/>
<?php endif ?>
<?php if(!isset($_COOKIE['Test'])) :
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<form action="" method="POST">
<input type="text" name="name"/><br/>
<input type="text" name="pass"/><br/>
<input type="text" name="mail"/><br/>
<input type="submit" value="go"/><br/>
<?php endif ?>
但是,我不知道如何让它正常工作:当我输入正确的用户名、密码和邮件时,我没有看到 "logout" 按钮,还有一个表格,我需要再次输入用户名,终于看到 "logout"。第二个问题,当我按 "logout" 时,没有任何反应。我想我无法设置 cookie,因为 headers 已经发送,但我不知道如何重写它。
根据@RowlandShaw 在评论中所述,setcookie()
只会影响未来的请求,不会影响当前的请求。
这是您更正后的代码:
<?php
if($_POST)
{
if(isset($_POST['name']) && isset($_POST['pass']) && isset($_POST['mail']))
{
if (($_POST['name'] == 'admin') and ($_POST['pass'] == 'admin') and ($_POST['mail'] == 'admin@gmail.com')) {
setcookie("Test","Value");
echo "Success!!! <br/>";
echo '<form action="" method="POST">'.
'<input type="submit" value="logout" name="logout"/><br/>'.
'</form>';
}
}
if (isset($_POST['logout'])) {
setcookie("Test", "", time() - 3600);
echo "Goodbye!";
echo '<br/>';
echo '<a href="'.$_SERVER['PHP_SELF'].'">Login back</a>';
}
}
else
{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<form action="" method="POST">
<input type="text" name="name"/><br/>
<input type="text" name="pass"/><br/>
<input type="text" name="mail"/><br/>
<input type="submit" value="go"/><br/>
<?php } ?>
您必须为同一页面创建一个 link,以便将 cookie 修改考虑在内。此外,您没有在注销按钮上设置名称,也没有通过添加 <form>
标记(默认为 GET
)指定注销操作是 POST
请求使 $_POST['logout']
从未设置。
几周前我开始研究 PHP,我对 PHP 代码块和设置 cookie 之间的条件嵌入 HTML 有点困惑。我想要做的是一个简单的代码来检查您的姓名、密码和 e-mail,设置 cookie(如果它们有效);当您已经登录后,您应该会看到 "log out" 按钮。所以,我的代码:
<?php
if (($_POST['name'] == 'admin') and ($_POST['pass'] == 'admin') and ($_POST['mail'] == 'admin@gmail.com')) {
setcookie("Test","Value");
echo "Success!!! <br/>";
}
if ($_POST['logout']) {
setcookie("Test", "", time() - 3600);
echo "Goodbye!";
}
?>
<?php if(isset($_COOKIE['Test'])) :
?>
<input type="submit" value="logout"/><br/>
<?php endif ?>
<?php if(!isset($_COOKIE['Test'])) :
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<form action="" method="POST">
<input type="text" name="name"/><br/>
<input type="text" name="pass"/><br/>
<input type="text" name="mail"/><br/>
<input type="submit" value="go"/><br/>
<?php endif ?>
但是,我不知道如何让它正常工作:当我输入正确的用户名、密码和邮件时,我没有看到 "logout" 按钮,还有一个表格,我需要再次输入用户名,终于看到 "logout"。第二个问题,当我按 "logout" 时,没有任何反应。我想我无法设置 cookie,因为 headers 已经发送,但我不知道如何重写它。
根据@RowlandShaw 在评论中所述,setcookie()
只会影响未来的请求,不会影响当前的请求。
这是您更正后的代码:
<?php
if($_POST)
{
if(isset($_POST['name']) && isset($_POST['pass']) && isset($_POST['mail']))
{
if (($_POST['name'] == 'admin') and ($_POST['pass'] == 'admin') and ($_POST['mail'] == 'admin@gmail.com')) {
setcookie("Test","Value");
echo "Success!!! <br/>";
echo '<form action="" method="POST">'.
'<input type="submit" value="logout" name="logout"/><br/>'.
'</form>';
}
}
if (isset($_POST['logout'])) {
setcookie("Test", "", time() - 3600);
echo "Goodbye!";
echo '<br/>';
echo '<a href="'.$_SERVER['PHP_SELF'].'">Login back</a>';
}
}
else
{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<form action="" method="POST">
<input type="text" name="name"/><br/>
<input type="text" name="pass"/><br/>
<input type="text" name="mail"/><br/>
<input type="submit" value="go"/><br/>
<?php } ?>
您必须为同一页面创建一个 link,以便将 cookie 修改考虑在内。此外,您没有在注销按钮上设置名称,也没有通过添加 <form>
标记(默认为 GET
)指定注销操作是 POST
请求使 $_POST['logout']
从未设置。