使用会话错误登录

时间:2012-12-08 12:31:06

标签: php mysql session login

我使用与sql db的会话创建了登录系统。当我输入正确的用户名和密码时,我可以登录。但是当我输入错误的消息时,它没有显示Incorrect username or password消息,它保留在checklogin.php页面(空白页面)。我该如何解决这个问题?这是checklogin.php:

session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];

    $dbh = new PDO("mysql:host=$hostname;dbname=...", $username, $password);
    $sql = "select * from user where username='$myusername' and password='$mypassword' ";
    foreach ($dbh->query($sql) as $row){

if (isset($myusername) && isset($mypassword)) {
  if (($row['username']==$myusername) && ($row['password']==$mypassword)) {
    $_SESSION['login']='true';
    echo "Login successfully";
    echo"<a href='log_out.php'>Logout</a>";
    }else{
    echo "Incorrect username or password";
    }
}
    }

5 个答案:

答案 0 :(得分:1)

我在你的代码中看到一些奇怪的东西:一方面是PDO连接,另一方面是mysql_real_escape_string。

所以,为了使你的代码更具可读性,我会在PDO中使用预处理语句:

session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];
$dbh = new PDO("mysql:host=$hostname;dbname=", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = "select * from user where username=:myusername AND password=:mypassword ";
$statement = $dbh->prepare($sql);
$statement->execute(array(':myusername'=>$myusername,':mypassword'=>$mypassword));
if($row = $statement->fetch(PDO::FETCH_ASSOC)){//if there is someone with given informations 
  echo "Welcome !";
else{
   echo "Wrong password or identifier";
}

正如您所看到的,我执行查询(使用prepare / execute或with query)然后我使用fetch来获取结果。使用PDO,有一个函数fetchAll,它允许您获取整个结果数组,以便您可以使用foreach而不是while循环遍历它。

然后,我的代码遗漏了一些东西:你没有在连接字符串中提供你的数据库名称,所以它不起作用。

我还添加了一行来处理错误。

答案 1 :(得分:1)

$row=$dbh->query($sql);
if ($row['username']='' && $row['password']!='') {
  if (($row['username']==$myusername) && ($row['password']==$mypassword)) {
    $_SESSION['login']='true';
    echo "Login successfully";
    echo"<a href='log_out.php'>Logout</a>";
    }else{
    echo "Incorrect username or password";
    }
}

答案 2 :(得分:1)

只计算$sql返回的结果就足以检查用户凭据。如果count为1,则应该登录用户,否则应显示Incorrect Password or Username消息。

session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];
$dbh = new PDO("mysql:host=$hostname;dbname=...", $username, $password);
$sql = "select count(*) from user where username='$myusername' and password='$mypassword'";
if (isset($myusername) && isset($mypassword))
{
 $nRows = $dbh->query($sql)->fetchColumn(); 
 $count= (int) count($nRows);

 // If result matched $myusername and $mypassword, table row must be 1 row
 if($count==1){
 // Register $myusername, $mypassword and redirect to file "login_success.php"
 $_SESSION['login']='true';
 header("location:login_success.php");
 }
 else {
 echo "Wrong Username or Password";
 }
}
else {
 echo "Please enter Password and Username";
  }

如果密码与显示错误不匹配,我建议您检查checklogin.php的凭据以及成功将用户重定向到另一个页面login_success.php(例如)在checklogin.php

答案 3 :(得分:0)

$sql = "select count(*) as exist from user where username='$myusername' and password='$mypassword' ";
foreach ($dbh->query($sql) as $row){
    if (row['exist'] > 0) {
        $_SESSION['login']='true';
        echo "Login successfully";
        echo"<a href='log_out.php'>Logout</a>";
    }else{
        echo "Incorrect username or password";
    }
}

答案 4 :(得分:0)

您正在选择具有正确用户名和正确密码的用户。然后,你用foreach循环迭代它们 如果密码错误,语句将不会选择任何内容,并且foreach循环中的代码将不会被执行 - 错误消息在该循环内,因此不会被回显。
如果返回行,则必须检查数字,如果数字为零,则显示错误 但是在循环之外这样做。