0

我已经使用与我的 sql 数据库的会话创建了登录系统。当我输入正确的用户名和密码时,我可以登录。但是当我输入错误时,它没有显示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";
    }
}
    }
4

5 回答 5

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";
}

如您所见,我确实执行了查询(使用准备/执行或使用查询),然后我使用 fetch 来获取结果。使用 PDO 有一个函数 fetchAll,它允许您获取整个结果数组,以便您可以使用 foreach 而不是 while 循环遍历它。

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

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

于 2012-12-08T12:39:36.460 回答
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";
    }
}
于 2012-12-08T12:52:01.323 回答
1

仅计算返回的结果$sql就足以检查用户凭据。如果计数为 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.

于 2012-12-08T12:55:04.220 回答
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";
    }
}
于 2012-12-08T12:37:54.620 回答
0

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

于 2012-12-08T12:44:58.043 回答