2012-04-22 72 views
1

我想创建一个简单的登录凭证检查器(使用会话变量)。PHP检查密码脚本不会为多个用户工作

这是我到目前为止有:

<?php 
include("dbconnect.php"); 
$u_name = mysql_real_escape_string($_POST['uname']); 
$p_word = mysql_real_escape_string($_POST['pword']); 
# *** querying all records *** 
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users"); 
while($rst = mysql_fetch_array($query)) { 

//echo $rst[valid_username] . ", "; 
//echo $u_name . " || "; 
//echo ($rst[valid_username] == $u_name) . " || "; 
//echo $rst[valid_password] . ", "; 
//echo $p_word . " || "; 
//echo ($rst[valid_password] == $p_word) . " || "; 
//echo (($rst[valid_username] == $u_name) AND ($rst[valid_password] == $p_word)); 
//echo "<br/>"; 

if (($rst[valid_username] == $u_name) AND ($rst[valid_password] == $p_word)) { 
    session_start(); 
    $_SESSION['login'] = "1"; 
    header('Location: main.php') ; 
} else { 
    session_start(); 
    $_SESSION['login'] = ''; 
    header('Location: badlogin.php') ; 
} 


} 

?> 

这里的问题:如果MySQL表中有一个以上的用户在它的列表中,检查中断。只有表中最后输入的用户已授予访问权限。输入的最后一位用户之上的任何人都会被碰到不正确的登录屏幕 - 即使凭据正确。为什么发生这种情况?任何人都可以提出一个代码修复或更好的代码来实现这个登录检查?

编辑:评论代码测试以查看提供的凭据是否与记录中的凭据相匹配。该脚本的那部分工作正常。

问题解决了!谢谢你们。对于将来看到这个的任何人,绝对要加密你的密码,我的是纯文本,因为这是一个本地测试应用程序,甚至不会看到上传到网络。

+4

不要将密码存放在纯文本。 – SLaks 2012-04-22 02:42:52

+0

使用用户名进行查询。数据库就是为这种事情而精确优化的 - 使用它! – lynks 2012-04-22 02:45:23

回答

4

没有必要遍历所有的用户记录。试想一下,如果您的数据库拥有1000000个用户,则只需要尝试获取与提供的用户名和密码相对应的记录。更新您的查询是这样的:

$query = mysql_query("SELECT * FROM notes_users 
         WHERE 
         valid_password = '$p_word' && 
         valid_username = '$u_name'"); 

,那么你会做这样的事情:

if (($row = mysql_fetch_array($query)) { 
    // valid user 
} else { 
    // invalid password or username 
} 
+1

从技术上说,他正在循环播放每一条记录,除非他想要进行身份验证的记录是最后一条记录,否则它会中断。所以他要么退出循环时,他想要在数据库中认证的用户名(坏主意)或具体与查询(好主意)。 – Blake 2012-04-22 02:46:17

1

首先,以纯文本的形式不存储密码!改为使用md5/sha1散列。

其次,这不是获取数据库中所有用户列表的好主意。您在SQL查询中的WHERE子句 - 这也将解决您的问题。

+0

不要忘记盐! – lynks 2012-04-22 02:48:14

+0

是的,感谢纠正我;) – 2012-04-22 03:12:28

0

您应该检查特定用户的登录详细信息。

$query = mysql_query("SELECT valid_username, valid_password FROM notes_users WHERE valid_password = '$p_word' && valid_username = '$u_name' "); 

这将返回唯一一个要检查的行。

0

为什么不直接查询用户的凭证?例如:

$statement = mysql_query("SELECT valid_username FROM notes_users WHERE \ 
valid_username = '{$u_name}' and valid_password = '{$p_word}' LIMIT 1;"); 

if (mysql_num_rows($statement) > 0) { /* log user in */ } 
else { /* bad log in */ 

哦,为什么你不使用===运算符进行字符串比较?看看它,它更实用。

0

这是糟糕的代码,

$query = mysql_query("SELECT valid_username, valid_password FROM notes_users"); 

使用下面的代码:

$postedUsername=mysql_real_escape_string($_POST['uname'])); 
$postedPass=mysql_real_escape_string($_POST['pass'])); 
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users where username='$postedUsername' and password='$postedPass'"); 
+1

这是不好格式。 – Blake 2012-04-22 02:48:14

+0

请格式化代码以便于理解 – 2012-04-22 02:51:04

+0

我是新手,在stackoverflow.Ok,对不起。我会改进它。 – 2012-04-22 02:59:29