PHP PDO :: FETCH_ASSOC问题

时间:2013-07-12 20:23:16

标签: php login pdo

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

<?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 个答案:

答案 0 :(得分: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'];
    }
}    

答案 1 :(得分:0)

这里有一些问题。

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

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

由于两个不同的原因,您发送相同的错误,导致混淆。

如果你像@Your Common Sense那样对你的代码进行重构,那么真正有用的是什么呢?这将有助于您更好地发现问题。