• ベストアンサー

セッションをログインについて

はじめまして。 今、セッションを使ったログインのページを作っています。 流れは、 1.ログインページでIDとパスワードを入力。 2.入力したID・パスワードがあらかじめMysqlに保存してあったのと一致していたら会員ページに移動。 3.セッションにID・パスワードを保存してブラウザを閉じない限り、次回はログイン無しで会員ページに直接いけるようにする。セッションに保存されてないときはログインページにもどす。 以上の流れにそってプログラムを作りました しかし1・2は上手くいったのですが3の部分がうまくいきません。セッションにIDとパスワードを保存することができてるようなのですが、ブラウザを閉じずに、いったん別にページに行き、もう一度会員ページにもどろうとすると、ログインページ戻されてしまい、もう一度ログインしなければいけません。 以下に今回のプログラムを書きました。このプログラムのどこを直せば、いいのかお分かりになる方いらっしゃいましたらアドバイスのほうよろしくお願いします。 使用環境は PHP 5.2.5(xampp使用) MySQL 5.0.51a register_globals = Onになっています。 /*ログインページは省略しました。パスワードとユーザーIDを入力してこのページに飛びます。*/ <?php function redirect($url) { header("Location: ".$url); exit; } session_start(); /*保存していたセッションが存在するか確認なければログインのページにもどす。$_SESSION['username']) の部分を$_POST…にしたのですがそれでも結果は同じでした。*/ if(empty($_SESSION['username']) || empty($_SESSION['password'])) redirect("loginpage.php"); $user = $_POST['username']; $pass = md5($_POST['password']); /*Mysqlへ接続。セッションの問題が解決したらMysql用のクラスを作る予定です。*/ $dbHost = "localhost"; $dbUser = "*****"; $dbPass = "******"; $dbDatabase = "mysql"; $db = mysql_connect("$dbHost", "$dbUser", "$dbPass") or die ("Error connecting to database."); mysql_select_db("$dbDatabase", $db) or die ("Couldn't select the database."); $result=mysql_query("select * from users where username='$user' AND password='$pass'", $db); $rowCheck = mysql_num_rows($result); /*ID・パスワードが間違ってたら、ログインページに戻す。*/ if(empty($rowCheck)) redirect("loginpage.php"); $row = mysql_fetch_array($result); /*IDとパスワードをセッションに保存*/ $_SESSION['username'] = $user; $_SESSION['password'] = $pass; if($rowCheck > 0) { while($row = mysql_fetch_array($result)) { } /*ログイン成功したら会員ページを表示。*/ echo "Login Succeeded!".$_SESSION['username'];/*←セッションに保存されてるかのテスト。ちゃんと表示されました*/ include("C:/xampp/htdocs/cvptoylibrary.com.au/assets/includes/link1.php"); include("C:/xampp/htdocs/cvptoylibrary.com.au/assets/includes/link3.php"); } else { /*ID・パスワードを間違えてたらログインページに戻す。*/ echo 'Incorrect login name or password. Please try again.'; redirect("loginPage.php" ); } ?>

質問者が選んだベストアンサー

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.1

プログラムの頭で、セッションを確認していますが、これから確認を行って、セッションを設定するんですよね? としたら、この段階でセッションをチェックしても、意味がないのではないでしょうか? $_POSTでも同じ結果との事でしたが、$_POSTがちゃんと設定されてないとしか思えません。 var_dump($_POST)を入れて値を確かめたらどうでしょう?

mayland
質問者

お礼

もうしわけございません。 先ほどの補足の訂正をさせていただきます。 いったん、違うページに行ってまたこのページに戻ってくると、$_POSTの値はNULLになってしまいました。やっぱりPOSTに問題があるのかもしれないです。うまく設定できるようにいろいろプログラムを試してみます。

mayland
質問者

補足

ご解答ありがとうございます。 ご指摘の通り最初の部分を$_POSTに変え、var_dump($_POST)を入れてみたら値はログインのページ入力したものと同じなのがでました。。。他のところに問題があるのかも知れません。

その他の回答 (1)

  • memphis
  • ベストアンサー率40% (975/2395)
回答No.2

セッション処理が、ID/PWの記録だけで読み取りの処理がないから失敗しています。

mayland
質問者

お礼

ご解答ありがとうございました。 よくよく見てみたら、 /*ログインフォームからの値をセッションに保存*/ $user = $_POST['username']; $pass = $_POST['password']; $_SESSION['username'] = $_POST['username']; $_SESSION['password'] = $_POST['password']; ここの部分が間違っているのでなんどもやってもうまくいかないということに気がつきました。このままだと、他のページにいったら$_POSTの値は無くなり、$_SESSION['username'] = $_POST['username']; にしたら$_SESSIONの値もなくなってしまい、それだから上手くいかなかったようです。 この部分の処理を if($_POST && !empty($_POST['username'])) { $_SESSION['username'] = $_POST['username']; $_SESSION['password'] = $_POST['password']; } $user = $_SESSION['username']; $pass = $_SESSION['password']; として、$_POSTに値が入ってるときのみ$_SESSIONの処理をするようにしましたところ、上手くいきました。 よくよく考えてみれば単純なことだったかもしれません。 あとはセッションの有効期限などの問題などもありますが、まずこのプログラムがうまくいったので、質問を終了させていただきました。どちらの方の意見も大変参考になりましたが、最終的に$_POSTの問題の方が大きかったと思いましたので、$_POSTについて言及していただいたmasaさんに20ptつけさせていただきました。 今回は本当にありがとうございました。またわからないことがありましたら質問させていただきますのでよろしくお願いいたします。

mayland
質問者

補足

ご解答ありがとうございます。 memphisさんが指摘されたこととは違うのかもしれませんが 途中の if($rowCheck > 0) { の前にisset(…を入れてみました。 お二人のご解答を参考に自分なりにプログラムを変えてみました。以下に載せて起きます。 <?php function redirect($url) { header("Location: ".$url); exit; } session_start(); /*ログインフォームからの値をセッションに保存*/ $user = $_POST['username']; $pass = $_POST['password']; $_SESSION['username'] = $_POST['username']; $_SESSION['password'] = $_POST['password']; $dbHost = "localhost"; $dbUser = ****** $dbPass = *****; $dbDatabase = ******; $db = mysql_connect("$dbHost", "$dbUser", "$dbPass") or die ("Error connecting to database."); mysql_select_db("$dbDatabase", $db) or die ("Couldn't select the database."); $result=mysql_query("select * from user where username='$user' AND password='$pass'", $db); $rowCheck = mysql_num_rows($result); $row = mysql_fetch_array($result); /*テスト用にPOSTとSESSIONの値の確認*/ var_dump($_POST); echo "</br>"; var_dump($_SESSION); echo "</br>"; /*SESSIONに値が保存されかつMysqlにある値とパスワードが一致していれば会員ページに移動*/ if(isset($_SESSION['username'])) { if($rowCheck > 0) { echo "Login Succeeded!"; include("C:/xampp/htdocs/cvptoylibrary.com.au/assets/includes/link1.php"); include("C:/xampp/htdocs/cvptoylibrary.com.au/assets/includes/link3.php"); } else { echo 'Incorrect login name or password. Please try again.'; redirect("loginPage.php" ); } } else { redirect("loginPage.php" ); } ?>

関連するQ&A

専門家に質問してみよう