-1

我的代码有效,但仅适用于第一行。当我在 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.';

    }



?>
4

2 回答 2

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'];
    }
}    
于 2013-07-12T20:32:42.167 回答
0

这里有几个问题。

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

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

您出于两个不同的原因发送相同的错误,从而导致混乱。

真正对您有帮助的是,如果您像@Your Common Sense 显示的那样重构您的代码,然后再查看它。这将帮助自己更好地看到问题。

于 2013-07-12T21:03:11.530 回答