スレッド表示 | フラット表示〕 全トピック 920 件中 775 番目 次≫ ≪前

セッション変数について

created: 2003-10-24 01:23 | modified: 2003-10-25 22:42 | reply: 4

[806] セッション変数について

user: kaz | created: 2003-10-24 01:23
今、セッションを使ったログイン処理を作っているのですが、ログイン後、別のページに移動するとセッション変数が消えてしまう現象に悩まされています。今行っている処理の概要は次の通りです。
index.phpでユーザIDとパスワードを入力しPOSTでlogin.phpを呼ぶ
login.phpがDBをチェック後ユーザIDをセッション変数に登録し、別ページへのリンク(another.php)を表示
そのリンクをクリックしてページを移動
another.phpでセッション変数を表示しても何も表示されない

ちなみにセッションデータはmysqlのDBに保存しています。
login直後は確かにテーブルにユーザIDが保存されているのですが
別ページに移動したとたんレコードはあるがセッションデータが消えている状態です。

セッションハンドラは各スクリプトの先頭でインクルードし、session_start()も行っております。php.iniのegister_globalsは Offなのでセッション変数の値は$_SESSION['uid']の形式で取得しています。

なにか思い当たるところがありましたら是非お教えください。

OS:WinXP Pro+IIS
PHP:4.3.3
reply: 807 返信 編集 削除

[807] Re.セッション変数について

user: hamaji | created: 2003-10-24 01:53
>ログイン後、別のページに移動するとセッション変数が消えてしまう現象に悩まされています。
上書きされるという現象は見たことありますが、消えるというのは聞いたことがないですね。

とりあえず、各スクリプトでセッションIDを表示してみて、どこでロストされているのかを突き止めましょう。
echo "セッションIDは" . session_id();
でセッションIDを表示できます。

あと、
<a href="xxxx.php?sid=<?php echo session_id() ?>">次へ</a>
などで正しくセッションIDが引き渡されているか確認してください。

※注意!!
セッションIDをURLに明示するのは本番では止めてくださいね。
あと、register_globalsがOffならecho SID というのはできなかったと思いますのでsession_id()を使ってください。

IISとAPacheだから。。。という違いはないと思いますんで。

あと、どのディレクトリにセッションデータを保存するようにしてるのかわからないですが、
ちゃんとそこにsess_c1516f7....というファイルができていることを確認してください。

>セッションデータはmysqlのDBに保存...
というのもちょっと気になりますが。。。
#追記
>セッションデータはmysqlのDBに保存...
とはsession_save_handlerがFilesではないということでしょうか?
となるとDBからセッションデータの読み出しができてない可能性がありますね。
その辺の自作関数というのはどうなっているのでしょうか?


[追伸]
セッションにこだわらなければこんなログイン管理もありますよ。
http://www.php.net/manual/ja/features.http-auth.php

#失礼
上記はApacheモジュールに組み込んだときのみ有効とのことでした。IISでは不明です。すいません。
Parent: 806  reply: 809 返信 編集 削除

[809] Re.セッション変数について

user: kaz | created: 2003-10-24 02:18
hamajiさん、返信ありがとうございました。
> 上書きされるという現象は見たことありますが、消えるというのは聞いたことがないですね。
どうも見る限りセッション変数自体が消えてしまっています。
とりあえずご指摘に従ってセッションIDの確認をしてみました。
その結果セッションIDは正しく引き渡されているようです。
どちらのページでも同じセッションIDが表示されました。
しかし、セッション変数はやはりリンク先のページでは消えていました。

> あと、どのディレクトリにセッションデータを保存するようにしてるのかわからないですが、
> ちゃんとそこにsess_c1516f7....というファイルができていることを確認してください。
セッションデータはsession_set_save_handler()を使用してmysqlに保存するようにしているのでファイルとしては存在していません。
感じとしてはリンク先ページでstart_session()をしたときにwriteのハンドラが呼ばれているものの引数に値が渡ってきていないような気がします。
Parent: 807  reply: 810 返信 編集 削除

[810] サンプル

user: hamaji | created: 2003-10-24 02:59
> どちらのページでも同じセッションIDが表示されました。
となるとセッション変数じたいは問題なしですね。

> セッションデータはsession_set_save_handler()を使用してmysqlに保存するようにしているので
>ファイルとしては存在していません。
失礼をば。

> 感じとしてはリンク先ページでstart_session()をしたときにwriteのハンドラが呼ばれているものの引数に値が渡ってきていないような気がします。

参考書にあったのを参考に書いてみました
テーブルの構成とかは当てにしないでください。また、セッションIDをPRIMARY KEY属性と考えてます。
// セッションデータを取得する関数
function SessionRead($key, $dbh) {
$strsql = "SELECT SESSION_DATA FROM T_SESSION";
$strsql .= " WHERE SESSION_ID = '$key'";

$result = mysql_query($strsql, $dbh);
$row = mysql_fetch_assoc($result);
return $row['SESSION_DATA'];
}

// セッションデータを書き込む関数
function SessionWrite($key, $dbh, $value) {
$value = addslashes($value);

// 新規登録用クエリ
$strsql1 = "INSERT INTO T_SESSION VALUES(";
$strsql1 .= "'$key', '$value') ";

// データ更新用クエリ
$strsql2 = "UPDATE T_SESSION SET";
$strsql2 .= " SESSION_DATA = '$value'";
$strsql2 .= " WHERE SESSION_ID = '$key'";

// インサートを試みて、失敗すればデータがすでにあることになるのでアップデートを行う。
if (!$result = mysql_query($strsql1, $dbh)) {
$result = mysql_query($strsql2, $dbh);
}

// データが正しく登録、更新されたか
$affectedrows = mysql_affected_rows($result);
return $affectedrows;
}
あてになるかどうかわかりませんが
参考まで。
Parent: 809  reply: 819 返信 編集 削除

[819] 解決しました。

user: kaz | created: 2003-10-25 22:42
セッション変数の件、解決しました。
原因は私の凡ミスでした。
セッション自体にはなにも問題はなく、readハンドラの中のセッションデータを取得するsqlに誤りがあったためページを移動するときに結果としてセッションデータが消えてしまったようです。
色々教えて頂いたhamajiさん、こんな間抜けな結果で済みませんでした。
しかし、hamajiさんとのやり取りの中で解決に至ったのは確かで、とても感謝しております。
ありがとうございました。
Parent: 810  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 775 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑