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 に答える