会員ページ SESSIONについて
レンタルサーバはさくらインターネット、プランはプレミアムです。
PHPは5.2.171、MySQLは5.1です。
login.phpから各メンバーのIDとPWを入力してデータベース内ののデータと一致したら、main.phpにLocationでとぶようにしています。
2日前ほどからログインができなくなり、大変困っています。(それまでは問題なくログインができた。)
原因はわからないのですが、色々検証したところ、
login.phpでログインしたときにmain.phpでIDが取得できていないということがわかりました。
コードは下記のようになります。
login.php
if ($uid != "" || $upass != "") {
$link = mysql_connect($DB_HOST,$DB_USER,$DB_PASS);
mysql_select_db($DB_NAME,$link);
$uid = mysql_real_escape_string($uid, $link);
$upass = mysql_real_escape_string($upass, $link);
$userQuery = sprintf("SELECT count(*) as `cnt` FROM `member` WHERE `id`='%s' AND `password`='%s'",$uid,$upass);
$userResult = mysql_query($userQuery, $link) or die(mysql_error());
if ($row = mysql_fetch_assoc($userResult)) {
$count = $row['cnt'];
if ($count == 1) {
session_start();
$_SESSION['ok_flg'] = 1;
$_SESSION['uid'] = $_REQUEST['id'];
header("Location: main.php");
exit;
} else {
$msg = '<p class="error">ユーザーIDまたはパスワードが違います。</p>'."\n";
}
} else {
$msg = '<p class="error">ユーザーIDまたはパスワードが違います。</p>'."\n";
}
}
省略部分が少しありますが、特に問題ないと思います。
main.php
session_start();
if ($_SESSION['ok_flg'] != 1) {
header("Location: /");
exit;
}
if (!isset($_SESSION['uid'])) {
header("Location: /");
exit;
}
$uid = mysql_real_escape_string($_SESSION['uid'], $link);
$userQuery = sprintf("SELECT * FROM `member` WHERE id='%s' ",$uid);
$userResult = mysql_query($userQuery, $link) or die(mysql_error());
if ($row = mysql_fetch_assoc($userResult)) {
$user_name = $row['user_name'];
}
echo $user_name;
としています。
ここからが問題なのですが、
1.ログインするとSESSIONファイルが2つ発行されてしまう。
1つ目は空のファイル。2つ目がIDなどが記載されているファイル。
main.phpのsession_start()を取ると1つのみの発行。(IDなどが記載されている方。)
2.main.phpに切り替わったときに$_SESSION['ok_flg']と$_SESSION['uid']の値が取得できないためlogin.phpに戻される。
3.main.phpのsession_start()を取ればページは表示されるが、session_id()も$_SESSION['ok_flg']と$_SESSION['uid']の2つも取得できない。
3.main.phpでsession_start()を取れば他のページはsession_idは取得できるが$_SESSION['ok_flg']と$_SESSION['uid']が取得できない。
4.session_start()と併用で$_GETも使用しているページがあるが$_GETを使用しているページも2と同じ現象になる。
以上ですが、お分かりになる方がいらっしゃいましたら、教えていただけないでしょうか。
宜しくお願い致します。
お礼
ご返事が遅くなって申し訳ありません。 やはりデータベースに毎回問い合わせたほうがいいみたいですね。 参考にさせていただきます。 ありがとうございました。