PHP代码不成功

时间:2012-03-29 23:45:42

标签: php sql database

谁能告诉我为什么这段代码不起作用?我犯过什么愚蠢的错误?

问题: 有一个登录页面。在“登录”页面中,输入ID和密码,然后单击“输入”。点击进入后,它将运行下一个文件 login_now.php 。在我的数据库中,我有2个条目。第一个输入位置是经理,第二个输入位置是员工。与经理一起登录是非常成功的,而与员工一起登录是一个彻底的失败...失败,因为它从来没有做它应该做的事情只是让我回到登录页面。

这是 login_now.php 中的代码,这是单击输入按钮时的假设:

$query = "select * from emp where EID = '$myeid' and PASS = '$mypassword'";

//run the query
$result = mysql_query($query, $conn);
$row = mysql_fetch_assoc($result);

//found a record?
if (mysql_num_rows($result) > 0 and $row['POSITION']=="manager")            
{
   $_SESSION['eid'] = $myeid;           //remember name as a session variable
   $_SESSION['password'] = $mypassword; //remember password as a session variable
   header('Location: welmanager.php');  //redirect user to index
}
elseif (mysql_num_rows($result) > 0 and $row['POSITION']=="staff")
{
   $_SESSION['eid'] = $myeid;           //remember name as a session variable
   $_SESSION['password'] = $mypassword; //remember password as a session variable
   header('Location: welstaff.php');    //redirect user to index
}
else
{
   header('Location: login.php');       //kick back to login
}

如果此处显示 login.php 中的更多代码,请与我们联系。提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果出现条件,则可能会出现轻微错误。

if (mysql_num_rows($result) > 0 and $row['POSITION']=="manager")  

你必须使用或条件而不是和

if (mysql_num_rows($result) > 0 || $row['POSITION']=="manager") 

答案 1 :(得分:0)

不想加入潮流,关于会话管理的评论是一个解决的问题是正确的 - 即使你选择不使用它,你也可以从他们如何做到这一点中学到很多东西。看看CakePHP,Zend Framework,Symphony,甚至是PEAR。

其次 - SQL注入!即使不暴露于更广泛的互联网,您也不一定能保证您的员工都不是恶意的。

第三,看来你用纯文本存储你的密码;这是一个很大的诺托。人们经常重复使用护照;可以窃取您的用户记录的人(使用SQL注入)可以在网上银行尝试这些密码等。阅读散列密码。

第四,不要将密码以明文形式存储在任何地方 - 但肯定不会存储在会话对象中。你已经涵盖了......

实际代码在语法上看起来还不错,但有一些奇怪的事情。

if (mysql_num_rows($result) > 0 and $row['POSITION']=="manager")  

没有意义!如果没有结果,逻辑上$ row数组应为空。

你也没有真正区分合法的“用户名/密码不匹配”的情况和诸如在类型列中拥有STAFF而不是员工的错误。

我将其重构为:

$result = mysql_query($query, $conn);
$row = mysql_fetch_assoc($result);
if (mysql_num_rows($result) == 0)// no match!
{
   header('Location: login.php');       //kick back to login
}
//Maybe put in a catch for more than 1 record too - that would be a data bug. 


$_SESSION['eid'] = $myeid;           //remember name as a session variable

switch($row['POSITION']){
case "manager":            
   header('Location: welmanager.php');  //redirect user to index
   break;
case "staff":
   header('Location: welstaff.php');    //redirect user to index
   break;
default:
   echo ("Found unknown staff type. Error.");
}

现在您可以查看您的记录是否确实找不到 - 即用户名/密码组合不匹配 - 或者用户个人资料是否属于“职员”类型。