Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP会话注销时销毁按钮_Php_Login_Logout - Fatal编程技术网

PHP会话注销时销毁按钮

PHP会话注销时销毁按钮,php,login,logout,Php,Login,Logout,我目前正在一个有登录(用户名和密码)的网站上工作——密码保护由操作系统在操作系统中称为领域的文件夹级别的web服务器中的操作系统完成。在我们找到一个合适的PHP登录系统之前,现在必须这样做 下面的代码基于 我使用了3个文件(请参见底部的代码片段) 这个过程是: -单击index.php上的登录按钮 -输入用户名和密码以访问身份验证索引文件。 -单击logout按钮,它引用logout.php文件-它应该清除缓存并将用户返回到顶级索引 它不会“破坏会话”,因为在提示您重新输入密码时,不会要求您重新

我目前正在一个有登录(用户名和密码)的网站上工作——密码保护由操作系统在操作系统中称为领域的文件夹级别的web服务器中的操作系统完成。在我们找到一个合适的PHP登录系统之前,现在必须这样做

下面的代码基于

我使用了3个文件(请参见底部的代码片段)

这个过程是: -单击index.php上的登录按钮 -输入用户名和密码以访问身份验证索引文件。 -单击logout按钮,它引用logout.php文件-它应该清除缓存并将用户返回到顶级索引

它不会“破坏会话”,因为在提示您重新输入密码时,不会要求您重新输入密码,这基本上就是我希望发生的事情

我对php所知甚少,这让我有点困惑

index.php(带有登录按钮的顶级文件)


试验
authenticate/index.php(此文件夹受密码保护-包含带有“注销”按钮的索引文件,该按钮链接到logout.php文件)


注销
authenticate/logout.php

<?php   
session_start(); //to ensure you are using same session
session_destroy(); //destroy the session
header("location:/index.php"); //to redirect back to "index.php" after logging out
exit();
?>

受密码保护的文件夹与PHP无关

所使用的方法称为“基本身份验证”。除了要求用户关闭然后打开他们的浏览器外,没有跨浏览器的方式可以从中“注销”

以下是您可以在PHP中执行此操作的方法(完全删除
.htaccess
中的Apache basic auth或任何最先删除的位置):

login.php:

<?php
session_start();
//change 'valid_username' and 'valid_password' to your desired "correct" username and password
if (! empty($_POST) && $_POST['user'] === 'valid_username' && $_POST['pass'] === 'valid_password')
{
    $_SESSION['logged_in'] = true;
    header('Location: /index.php');
}
else
{
    ?>

    <form method="POST">
    Username: <input name="user" type="text"><br>
    Password: <input name="pass" type="text"><br><br>
    <input type="submit" value="submit">
    </form>

    <?php
}

用户名:
密码:

这是我的超级秘密内容


首先,在该注销按钮中给出
logout.php
页面的链接。在该页面中,生成下面给出的代码:

代码如下:

<?php
 session_start();
 session_destroy();
?>

会话启动后,上一个/当前用户的会话已启动,因此不需要声明用户名。它将通过session_destroy方法自动删除

//注销

if(isset($_GET['logout'])) {
    session_destroy();
    unset($_SESSION['username']);
    header('location:login.php');
}

?>

如果文件夹受密码保护,则PHP不进行身份验证。Apache(或web服务器)是。这是有道理的,非常感谢@xbonezAwesome!比HTTP身份验证方法要好得多,后者的注销代码要复杂得多。如果您想在所有三个代码块中添加PHP结束标记,我将向您提供答案。哎呀,我已经做了!:-)@法兰克福请参见:“如果文件是纯PHP代码,最好省略文件末尾的PHP结束标记。这可以防止在PHP结束标记后意外添加空格或新行,这可能会造成不必要的影响,因为当程序员无意在脚本中的该点发送任何输出时,PHP将开始输出缓冲。“我认为注销应该使用post方法实现,而不是get。感谢您提供的这段代码片段,它可能会提供一些有限的短期帮助。通过说明为什么这是一个很好的问题解决方案来正确解释它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。
<?php
session_start();
if (! empty($_SESSION['logged_in']))
{
    ?>

    <p>here is my super-secret content</p>
    <a href='logout.php'>Click here to log out</a>

    <?php
}
else
{
    echo 'You are not logged in. <a href="login.php">Click here</a> to log in.';
}
<?php
session_start();
session_destroy();
echo 'You have been logged out. <a href="/">Go back</a>';
<?php
 session_start();
 session_destroy();
?>
if(isset($_GET['logout'])) {
    session_destroy();
    unset($_SESSION['username']);
    header('location:login.php');
}