- ベストアンサー
セッションidの使い方について
参考書を読んだり調べたのですが、セッションidの使い方がよくわからないので質問させて下さい。 PHP4.3.10、 session.use_only_cookies off session.use_trans_sid offになっています。 携帯でログイン(login.php)後 メニュー(menu.php)でDBに登録されているIDとパスワードが一致したら SIDを発行してユーザの識別をしたいと考えています。 そこでわからないことがあります。 メニューにはA.php、B.php・・とあるのですが リンクするたびに <a href="A.php?<?php echo SID;?>">A.php</a> <a href="B.php?<?php echo SID;?>">B.php</a> のようにするのか、または$SID=session_id();のようにするのでしょうか。 そしてA.phpやB.phpでの識別はSIDをファイルなどに保存してその都度 これを呼び出し比較していくのでしょうか。 また、$_SESSION['a']="123";と session_register("a"); $a="123"; というのは同等の意味でしょうか。 質問ばかりですがどうぞよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>PHPSESSID=fac58ba5deffc80d2210bd8001ac350cが付加されこれを >呼び出すには例えば$SID=$PHPSESSID;などと変数にいれなくても >session_id()で呼び出せるという解釈でいいのでしょうか。 SIDは一般の変数ではありません(頭に「$」を付けません)。 自動的にPHPが値を設定するので、アプリでSIDに値を代入する必要はありませんし、値を設定することは出来ないと思います。 >また、ご提示いただいたソースを動かしてみました。 >メニューに<a href="B.php?<?php echo SID;?>">B.php</a>を追加して >クッキーが使えない環境で試したのですが、アクセスする度に >新しいPHPSESSIDが発行されます。 >この場合、SIDは変わってもsession[a]: 123の値は変わらないので同一ユーザと認識されるているのでしょうか。 >お手数ですがよろしくお願いします。 セッションIDが変わったならば、同じユーザとは認識されていません。 123で値が一定なのは、全ユーザに123を保存しているからです。 以下のように、A.phpに「menuに戻る」リンク(セッションID付き)を設けて、ユーザがこのリンクを辿ってmenu.phpに戻れば、セッションIDの値は引き継がれます。 ==== A.php ==== <?php session_start(); ?> <html> <body> sessionid: <?php echo session_id() ?><br> session[a]: <?php echo $_SESSION['a'] ?><br> <a href="menu.php?<?php echo SID ?>">menuに戻る</a> </body> </html> =============== そうではなく、ユーザがブックマークやリンクからmenu.phpに直接アクセスする場合は、そのたびに新しいセッションIDが発行されます。これはどうしようもないです。 #携帯電話なので、端末ID(サブスクライバID、個体識別情報、端末シリアル番号)を使用してユーザを識別する方法は存在します。
その他の回答 (3)
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
> print"$_SESSION['a'] "; この記述自体がエラーになっていると思います。 print("{$_SESSION['a']}"); とすればよろしいかと。
- fdsjaklfjas
- ベストアンサー率81% (96/118)
ご存知だと思いますが、携帯ではcookieが使用できません。 (最近の携帯だと使えるかも・・・)。 なので、質問にあるように、 <a href="A.php?<?php echo SID;?>">A.php</a> とするか、session.use_trans_sidをonにします。 session.use_trans_sidをonにすると、自動でaタグやformタグでセッションIDが次のページに渡されるように、PHPがHTMLを書き換えてくれます。 また、セッションIDとセッションにヒモ付けて保存したデータは、PHPが自動でファイルに保存してくれます(デフォルト設定の場合)。アプリケーションで、ファイルに書き出したり、それを読み込んだりする必要はありません。 以下のような2つのプログラムで試してみると、判りやすいかもしれません。 ==== menu ==== <?php session_start(); $_SESSION['a']='123'; ?> <html> <body> <a href="A.php?<?php echo SID ?>">A.php</a> </body> </html> ==== A.php ==== <?php session_start(); ?> <html> <body> sessionid: <?php echo session_id() ?><br> session[a]: <?php echo $_SESSION['a'] ?><br> </body> </html> PHPマニュアルのsession_start関数の例も、比較的わかりやすいと思います。 http://www.php.net/manual/ja/function.session-start.php
お礼
ご回答ありがとうございます。 >アプリケーションで、ファイルに書き出したり、それを読み込んだりする必要はありません。 すいません、まだ理解できない部分があるのですが、 PHPSESSID=fac58ba5deffc80d2210bd8001ac350cが付加されこれを 呼び出すには例えば$SID=$PHPSESSID;などと変数にいれなくても session_id()で呼び出せるという解釈でいいのでしょうか。 また、ご提示いただいたソースを動かしてみました。 メニューに<a href="B.php?<?php echo SID;?>">B.php</a>を追加して クッキーが使えない環境で試したのですが、アクセスする度に 新しいPHPSESSIDが発行されます。 この場合、SIDは変わってもsession[a]: 123の値は変わらないので同一ユーザと認識されるているのでしょうか。 お手数ですがよろしくお願いします。
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
デフォルトの設定では、PHPのセッション関数は、クッキーが使える場合はSIDをクッキーへ登録、使えない場合はURLへ埋め込むようになっています。 ですから、一般的には <a href="A.php?<?php echo SID;?>">A.php</a> のように書く必要はありません。 また、session_register関数はPHP 4.2以降では必要がありません。 http://jp2.php.net/manual/ja/function.session-register.php 通常は $_SESSION["a"] = "123"; と登録すれば、別ページから$_SESSION["a"]として取り出す事が可能です。 $a="123"; は$aに123を代入する、という事ですので、セッションとは無関係です。
お礼
ご回答ありがとうございます。 >$a="123"; これは関係ないのですね。勉強になりました。 別ページでの取り出しかたなのですが、 print"$_SESSION['a'] ";とするとエラーがでます。 Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING echo $_SESSION['a'];は問題ありませんでした。 printは使えないのでしょうか。 よろしくお願いいたします。
お礼
ご回答ありがとうございました。 SIDをリンクにつけるたびに新しく発行されるという勘違いをしていました。教えていただき理解できました。 また、メニューに戻るときSIDをつけたところ期待通りの動きが得られました。 個体識別を取得してログインする方法も用意しています。 まだうまくいかないのですが調べていきます。 本当にありがとうございました。