0

さて、新しいアプリを作成していて、データベースへのアクセスに PDO を使用することにしました。(私は PDO をまったく初めて使用しますが、db アクセスを行うにはこれが最善の方法であるという印象を受けています)。

現在、私のログイン スクリプトは非常にシンプルです。(ログインフォームから)指定されたユーザー名を持つユーザーのデータベースをチェックし、指定されたパスワードをプレーンテキストで保存されたパスワードと照合し(暗号化/復号化はまだ行われていません)、必要に応じてユーザーをリダイレクトします。簡単なシーケンス図を次に示します。

Login Screen ---(user enters credentials)--->Login Handler---(gets user details and compares pw)-->if (pw == stored pw)--->dashboard / else --->login w/ error msg

読みづらかったら申し訳ありませんが、流れを表現する最善の方法がわかりませんでした...とにかく...

ここに私の問題があります: 正しいユーザー名とパスワードを入力すると (大文字と小文字も区別されます!)、常にログイン画面にリダイレクトされ、エラー メッセージが表示されます。ただし、単に URL バーからダッシュボードに移動すると、(セッションが設定されていない場合のように) ログイン画面にリダイレクトされず、(ログインしたかのように) ユーザー名がナビゲーション バーに表示されます正しく入ります)。

繰り返しますが、これがわかりにくい場合は申し訳ありません。簡単に説明するのは難しいです。これが問題である場合は、より適切に説明するために、ある種のスクリーンキャストを行うことができます。いずれにせよ、ここに私のコードがあります:

loginHandler.php

if(!isset($_POST['username']) || !isset($_POST['password'])){
    header('Location: login.php?error=pass');
}
$username = $_POST['username'];
$pass = $_POST['password'];

//TODO: crypt password

try{
    $DB = new PDO("mysql:host=127.0.0.1;port=8889;dbname=cTix", 'root', 'root'); //TODO: change this when uploading to webserver
    $STH = $DB->prepare("SELECT * FROM users WHERE username = $username LIMIT 0, 1");
    $STH->setFetchMode(PDO::FETCH_OBJ);
    $STH->execute();
    $u = $STH->fetch();
    if($pass == $u->password){
        session_start();
        $_SESSION['uid'] = $u->id; //TODO: securely store uid
        header('Location: index.php');
    } else {
        //echo 'Your Password: ' . $pass . ' - Correct Password: ' . $u->password;
        header('Location: login.php?error=pass');
    }
} catch(PDOException $e){
    //echo $e->getMessage();
    header('Location: login.php?error=true');
    exit;
}

これは、dashboard.php のユーザー名を取得するコードです。

function connection(){
    $host = 'localhost';
    $dbname = 'cTix';
    $user = 'root';
    $pass = 'root';
    try {
        $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        return $DBH;
    } catch(PDOException $e){
        echo $e->getMessage();
        return null;
    }
}

function getUserById($id){
    $DB = connection();
    $STH = $DB->query("SELECT * FROM users WHERE id = $id");
    $STH->setFetchMode(PDO::FETCH_OBJ);
    $u = $STH->fetch();
    $DB = null;
    return $u;
}

function getUserName(){
    echo getUserById(getCurrentUserId())->name;
}

他に提供できる情報や、より役立つ情報があれば、お知らせください。

残念ながら、このばかげたログインの問題が解決されなければ、このアプリを先に進めることはできません。ありがとうございます!

4

1 に答える 1

2

ここにあなたの問題があります:

$STH = $DB->prepare("SELECT * FROM users WHERE username = $username LIMIT 0, 1");

ユーザー名をSQL文字列に連結していますが、引用符で囲んでいません。これで問題が解決すると思います。

$STH = $DB->prepare("SELECT * FROM users WHERE username = '$username' LIMIT 0, 1");

でも

バインドされたパラメータの使用方法を調べる必要があります。すでにPDOを使用していますが、SQLでユーザーが入力したコードを記述しており、バインドされたパラメーターはそれを回避します。これにより、この問題も回避されます。

これは機能するはずですが、私はそれをテストしていません:

$STH = $DB->prepare('SELECT * FROM users WHERE username = ? LIMIT 0, 1');
$STH->bindParam(1, $username);
$STH->setFetchMode(PDO::FETCH_OBJ);
$STH->execute();
于 2012-09-05T20:18:11.943 に答える