さて、新しいアプリを作成していて、データベースへのアクセスに 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;
}
他に提供できる情報や、より役立つ情報があれば、お知らせください。
残念ながら、このばかげたログインの問題が解決されなければ、このアプリを先に進めることはできません。ありがとうございます!