简单的PHP多用户登录,不同的页面取决于用户 - 这里有什么问题?

时间:2011-11-22 10:36:53

标签: php html forms webforms

我一直在寻找一个简单的PHP脚本+表单,根据输入的用户名和密码将用户路由到特定的URL。

页面顶部的代码:

<?php 
session_start();
$data=array("user1"=>array("url"=>"file1.php","password"=>"pass1"),
"user2"=>array("url"=>"file2.php","password"=>"pass2"));

if(isset($_POST['username']) && isset($_POST['password'])) {
    if($data[$_POST['username']]['password'] == $_POST['password']) {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);

        login('<p class="alert">Incorrect username or password.</p> ');
    }
} else {
    login();
}
?><?php
function login($response='Please enter your username and password.') {
?>

这是在身体:

<p><?=$response?></p>
<form action="" method="post">
    <table width="400" border="0" cellspacing="0" cellpadding="4">
        <tr>
            <td width="90"><label class="loginform" for="username">Username:</label></td>
            <td width="294"><input name="username" type="text" /></td>
        </tr>
        <tr>
            <td><label for="password">Password:</label></td>
            <td><input name="password" type="password"></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td><input type="submit" value="Login" /></td>
        </tr>
    </table>
</form>
<?php } ?>

此代码正常运行,但如果用户输入的密码不正确,则会重定向到空白页面(具体来说,它只会在最后一页之后加载页面:

<?php } ?>

我理解这段代码编写得不好,所以这是第一个问题。我真的很想看到一个写得很好的版本(只是为了学习和研究它)。但是,如果这不可能,我将如何更正此代码,以便错误的密码不会破坏页面?

这很奇怪,因为如果您没有输入任何内容(只需点击提交),它会显示“用户名或密码不正确”,如果您只输入一个没有密码的错误用户名,同样的事情。但是如果用户名+密码错误,或者密码错误,则会转到空白页面。

提前致谢!

2 个答案:

答案 0 :(得分:1)

缩进很重要的另一个教训。看看:

if(isset($_POST['username']) && isset($_POST['password'])) 
{
    if($data[$_POST['username']]['password'] == $_POST['password']) 
    {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);

        login('<p class="alert">Incorrect username or password.</p> ');
    }
} else {
    login();
}

现在你明白了。如果用户名和密码是POST,但不正确会怎样?没什么,它会退出if-blocks。

这样做:

if(isset($_POST['username']) && isset($_POST['password'])) 
{
    if($data[$_POST['username']]['password'] == $_POST['password']) 
    {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);
        exit();
    }
    else
    {
        login('<p class="alert">Incorrect username or password.</p> ');
    }
} else {
    login();
}

或者,甚至更好的imho:

$warning = '';

if(isset($_POST['username']) && isset($_POST['password'])) 
{
    if($data[$_POST['username']]['password'] == $_POST['password']) 
    {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);
        exit();
    }
    else
    {
        $warning = '<p class="alert">Incorrect username or password.</p> ';
    }
}

login($warning);

我希望我不必告诉你这不是任何保护,除非你在登录后在每个页面上比较$_SESSION['username']。: - )

答案 1 :(得分:0)

找出以下差异:)

提示:尝试indent括号,然后错误就会显而易见。

原:

if(isset($_POST['username']) && isset($_POST['password'])) {
if($data[$_POST['username']]['password'] == $_POST['password']) {
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);

login('<p class="alert">Incorrect username or password.</p> ');

}
} else {
login();
}

校正:

if(isset($_POST['username']) && isset($_POST['password'])) {
if($data[$_POST['username']]['password'] == $_POST['password']) {
$_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
header('Location: ' . $data[$_POST['username']]['url']);

} else {
login('<p class="alert">Incorrect username or password.</p> ');
}
} else {
login();
}