2

我在使用 PDO bindValue() 函数时遇到了一些问题。每当我似乎使用它时,我的查询总是返回 0 个结果。但是,如果我不使用 bindValue() 将 $user 和 $pass 直接放入 sql 中,它就可以正常工作

$user 是一个字符串
$password 是一个 sha1() 哈希

public function login($user, $pass) {
            global $CMS;

            $sql = "SELECT `username,`password` FROM `" . TB_PREFIX . "users` WHERE `username` = ':user' AND `password` = ':pass'";
            $query = $CMS->prepare_query($sql);
            $query->bindValue(':user', $user, PDO::PARAM_STR);
            $query->bindValue(':pass', $pass, PDO::PARAM_STR);
            $query->execute();

            # User successfully authenticated
            if ($query->rowCount() == 1) {
                # Get all data from DB and populate class variables
                self::populate_user_data($user);
                session_register($user . "-" . base64_encode($_SERVER['REMOTE_ADDR']));
                return true;
            }

            # User failed authentication            
            return false;
        }
4

3 回答 3

3

您不应该自己在值周围加上引号,它们将被添加(如果需要,例如在字符串的情况下 - 这种情况下):

$sql = "SELECT `username,`password` FROM `" . TB_PREFIX . "users` 
        WHERE `username` = :user AND `password` = :pass";
于 2012-01-02T18:54:59.107 回答
1

不得引用准备好的语句中的占位符;PDO 已经在做所有的报价。你要:

 $sql = "SELECT `username,`password` FROM `" . TB_PREFIX . "users` " .
        "WHERE `username` = :user AND `password` = :pass";
于 2012-01-02T18:55:16.980 回答
1

使用准备好的语句时,值会自动转义。

这意味着,您不必在参数周围设置引号。

尝试:

$sql = "SELECT `username,`password` ".
       "FROM `" . TB_PREFIX . "users` ".
       "WHERE `username` = :user AND `password` = :pass";

你应该没事。

不过附带说明:您永远不应该按字面意思存储用户密码。查看这篇优秀的文章:您可能错误地存储了密码

于 2012-01-02T18:57:27.213 回答