2011-11-22 75 views
0

我正在寻找一个简单的PHP脚本+表单,根据输入的用户名和密码将用户路由到特定的URL。简单的PHP多用户登录,取决于用户的不同页面 - 这里有什么问题?

<?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 } ?> 

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

这很奇怪,因为如果你什么都没输入(只是点击提交),它会显示“不正确的用户名或密码”,如果你输入的密码不正确,同样的事情。但用户名+密码错误,或只有错误的密码,它会进入空白页面。

在此先感谢!

回答

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'ed,但不正确?没有什么,它会退出这两个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(); 
} 

,或者甚至更好恕我直言:

$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']在登录后在每个页面上。:-)

+0

谢谢你的帮助。现在情况正好相反,如果你输入一个不正确的用户名,它会使页面空白。 Re:保护,它会将它们路由到另一个受PW保护的页面。 – user1059445

+0

奇怪,它似乎没关系= s – 2011-11-22 10:58:54

+0

@ user1059445然后[启用错误报告](http://stackoverflow.com/questions/74847/php-error-reporting-best-setting-for-development-e-strict)。您可能在调用header()之前输出数据,然后重定向不会发生。 – CodeCaster

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(); 
} 
+0

更正的版本更新:这似乎切换问题。现在用户空白页面。 – user1059445

相关问题