2013-07-12 105 views
-1

我的代码有效,但只适用于第一行。当我在MySQL中插入另一行并尝试使用不同的用户名和密码登录时,它会返回我的错误。怎么了?PHP PDO :: FETCH_ASSOC问题

<?php 
    include_once('db.php'); 

     $username = $_POST['username']; 
     $password = sha1($_POST['password']); 

      if(!empty($username) && !empty($password)) { 

       $loginSQL = "SELECT * FROM `users` WHERE `username` = '$username' AND `password` = '$password'"; 

       if($db->query($loginSQL)->fetchColumn() == 1) { 

        $fetchUsers = $db->query($loginSQL)->fetch(PDO::FETCH_ASSOC); 
         $userID = $fetchUsers['uid']; 
          $_SESSION['uid'] = $userID; 
           echo '<br /><br />You have successfully logged in. <a href="inner.php">Click here</a> to proceed.'; 


      } 

       else { 

        echo '<br /><br />You have entered invalid log-in information.'; 

     } 

    } 

    else { 

     echo '<br /><br />You have entered invalid log-in information.'; 

    } 



?> 

回答

2

两个最大的问题是获取和缺乏准备的语句。

<?php 
include_once('db.php'); 
if(!empty($_POST['username'])) { 
    $username = $_POST['username']; 
    $password = sha1($_POST['password']); 

    $sql = "SELECT uid FROM `users` WHERE `username` = ? AND `password` = ?"; 
    $stm = $db->prepare($sql); 
    $stm->execute(array($username,$password); 
    if($row = $stm->fetch()) { 
     $_SESSION['uid'] = $row['uid']; 
    } 
}  
0

这里有几个问题。

fetchColumn()返回第一行的第一列,这可能是也可能不是1,具体取决于数据库表的设置方式。

fetch()返回PDOStatement行指针所在的当前行。如果你不把它发送到下一行,它将不会移动。

由于两种不同原因,您发送的是同一错误,有助于导致混淆。

真正能够帮助你的是,如果你想像@Your Common Sense那样重构你的代码,然后看看它。它会帮助你更好地看到问题。

+0

对于这种检查凭证的特殊情况,认为相当好的做法不是提供过于确切的信息。所以,一个广义的错误信息是没问题的 –