Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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_Sqlite_Session_Login - Fatal编程技术网

Php 错误登录也会打开会话

Php 错误登录也会打开会话,php,sqlite,session,login,Php,Sqlite,Session,Login,我已经用sqlite编写了这个基于php的登录: <?php $db = new PDO('sqlite:data.db'); session_start(); if (isset($_SESSION['timeout'])) { if ($_SESSION['timeout'] + 4 < time()) { session_destroy(); } } else { $_SESSION['pass'] = ""; $_SES

我已经用sqlite编写了这个基于php的登录:

<?php
$db = new PDO('sqlite:data.db');

session_start();
if (isset($_SESSION['timeout'])) {
    if ($_SESSION['timeout'] + 4 < time()) {
        session_destroy();
    }
} else {
    $_SESSION['pass']    = "";
    $_SESSION['timeout'] = time();
}
if (isset($_POST['pass'])) {
    $_SESSION['pass'] = $_POST['pass'];
}

if (!empty($_SESSION['pass'])) {

    $result = $db->query("SELECT password,user FROM users");
    foreach ($result as $row) {
        if (password_verify($_SESSION['pass'], $row['password'])) {
            echo "Welcome! You're logged in " . $row['user'] . "!  <a href='index.php?logout=true'>logout</a>";
            if (isset($_GET['logout'])) {
                unset($_SESSION['pass']);
                header('location: index.php');
            }
        }
    }

}

else {
    echo '<form method="POST" action=""><input type="password" name="pass"><form>';
}
?>

这是我的sqlite(data.db):

我的问题如下:如果我与数据库中的一个用户登录,会话将持续4秒,您可以阅读消息:Hello user,您已登录(注销)

但是:如果我输入了一个错误的密码(不在数据库中),屏幕将变白,我也必须等待4秒钟


我的问题是:我如何将错误的登录重定向到登录表单,而无需等待会话完成?

我觉得逻辑有点不对劲,我会采取这种方法:

<?php
$db = new PDO('sqlite:data.db');
session_start();
if (isset($_GET['logout'])) { // if logout is set just log them out no need for other conditionals
    unset($_SESSION['pass']);
    header('location: index.php');
    exit(); //exit after header otherwise page keeps processing
}
if (isset($_SESSION['timeout'])) {
     if ($_SESSION['timeout'] + 4 < time()) {
        session_destroy();
     }
//} else {
//   $_SESSION['pass']   = "";
//   $_SESSION['timeout'] = time();
//}
//if (isset($_POST['pass'])) {
//   $_SESSION['pass'] = $_POST['pass'];
}
if (!empty($_POST['pass'])) {
    $result = $db->query("SELECT password,user FROM users");
    foreach ($result as $row) {
        if (password_verify($_POST['pass'], $row['password'])) {
            echo "Welcome! You're logged in " . $row['user'] . "!  <a href='index.php?logout=true'>logout</a>";
            $_SESSION['pass'] = $_POST['pass'];
            $_SESSION['timeout'] = time();
        }
    }
}
if(empty($_SESSION['pass'])) {
?>
<form method="POST" action="">
    <input type="password" name="pass">
    <input type="submit">
<form>
<?php
}
?>


此外,您还应该传递您正在测试密码的用户名。当您有更多用户时,此方法将需要较长的加载时间。当两个用户拥有相同的密码时,它也无法准确工作

我觉得这个逻辑有点不合我会采取这种方法:

<?php
$db = new PDO('sqlite:data.db');
session_start();
if (isset($_GET['logout'])) { // if logout is set just log them out no need for other conditionals
    unset($_SESSION['pass']);
    header('location: index.php');
    exit(); //exit after header otherwise page keeps processing
}
if (isset($_SESSION['timeout'])) {
     if ($_SESSION['timeout'] + 4 < time()) {
        session_destroy();
     }
//} else {
//   $_SESSION['pass']   = "";
//   $_SESSION['timeout'] = time();
//}
//if (isset($_POST['pass'])) {
//   $_SESSION['pass'] = $_POST['pass'];
}
if (!empty($_POST['pass'])) {
    $result = $db->query("SELECT password,user FROM users");
    foreach ($result as $row) {
        if (password_verify($_POST['pass'], $row['password'])) {
            echo "Welcome! You're logged in " . $row['user'] . "!  <a href='index.php?logout=true'>logout</a>";
            $_SESSION['pass'] = $_POST['pass'];
            $_SESSION['timeout'] = time();
        }
    }
}
if(empty($_SESSION['pass'])) {
?>
<form method="POST" action="">
    <input type="password" name="pass">
    <input type="submit">
<form>
<?php
}
?>


此外,您还应该传递您正在测试密码的用户名。当您有更多用户时,此方法将需要较长的加载时间。当两个用户拥有相同的密码时,它也无法准确工作

你只是在所有用户之间循环。您应该检查与特定用户的密码匹配情况。我一直在尝试将登录代码放在php工作表中的几个位置,但我不知道如何操作。你能帮我吗?你能格式化代码并提供数据库结构吗?您只存储密码吗?@chris85更改了上面的问题,向您显示了该信息。好的,您计划在表单中传递
用户
?您只是在所有用户之间循环。您应该检查与特定用户的密码匹配情况。我一直在尝试将登录代码放在php工作表中的几个位置,但我不知道如何操作。你能帮我吗?你能格式化代码并提供数据库结构吗?您只存储密码吗?@chris85更改了上面的问题,向您显示该信息。好的,您计划在表单中传递
用户