[PHP-users 8182] $_SESSIONの使い方(少し長文)

杉本誠 php-users@php.gr.jp
Fri, 21 Jun 2002 18:13:18 +0900


お世話になります。'すぎもと'といいます。

※環境はWin2k+Apache1.3.24+PHP4.2.1です

今、PHP4徹底攻略(赤)で、セッション管理の個所を勉強しております。
PHP4.2.1では、そのままのコードでは、セッションの変数が保存されませんでした。
あちこち調べて、下記のようなコードでやっと動作するようになりました。
結果、session_register() 等と $_SESSION を使う方法ではかなりの違いが生じたと
思います。
session_*() の場合は、セッション変数がその管理下にあり、関数で操作、保存も自
動で行なわれる(?)という感じでした。
$_SESSIONを使う場合、通常の変数と同じような使い方になっている感じです。
登録も保存も明示的に行なう。
それでいて、session_start()、session_destroy()という関数は使ってもいいようで
す。

で、質問なのですが、下記のコードは正しいのでしょうか?
はっきり言って、かなりあちこち見に行っても、分かりやすい説明が無かったもので
すから、試行錯誤の結果になってます。

PHP4徹底攻略(赤)のChapter4-4のサンプルコードを抜粋修正
incファイルの部分は省略してます(よって処理は無意味になってます)
--- 以下 test9b.php ファイル ---
<?php
//セッションを開始/復帰
session_start();

//セッションデータを破棄
$button = $HTTP_GET_VARS[button];
if(strcmp($button, "履歴のクリア")==0){
 session_unset();
 session_destroy();
}

//セッションへ変数を登録 session_register('hist')と同じ?
$hist=$_SESSION[hist];

//変数がセットされているか検査
if (!isset($_SESSION['hist'])) {
     $_SESSION['hist'] = "";
}

//入力画面の表示
function display_input_area($yyyy,$mm,$dd,$hist)
{
?>

<form action="test9b.php?<?=SID?>">
西暦
<input type=text name=yyyy size=5 value="<? echo $yyyy; ?>">年
<input type=text name=mm size=3 value="<? echo $mm; ?>">月
<input type=text name=dd size=3 value="<? echo $dd; ?>">日
<input type=submit value="送信">
<input type=submit name=button value="履歴のクリア">
</form>
<?
}

//メイン
//PHP4.2用に追加
$yyyy=$_GET[yyyy];
$mm=$_GET[mm];
$dd=$_GET[dd];

printf("<!-- %s -->\n","前回のセッション名=".session_name());
printf("<!-- %s -->\n","前回のセッションID=".session_id());
printf("<!-- %s -->\n","セッションモジュール名=".session_module_name());
printf("<!-- %s -->\n","セッションデータ保存path名=".session_save_path());
printf("<!-- %s -->\n","\$histがセッションに登録されているか="
 .(isset($hist) ? "True":"False"));
printf("<!-- %s -->\n","前回の\$hist=".$hist);
//入力エリア表示
display_input_area($yyyy,$mm,$dd,$hist);
if(empty($yyyy)&& empty($mm)&& empty($dd)) exit;
$result=sprintf("西暦%d年%d月%d日<br>\n",$yyyy,$mm,$dd);
//結果の表示
echo $result;

if($hist){
//履歴の表示
 print("<table border>\n<tr><td>\n$hist</table>\n");
}
//履歴に追加
if($result){
 $hist=date("Y/m/d H:i:s "). $result . $hist;
}

//明示的に保存(自動では格納されない?)
$_SESSION[hist] =$hist;
printf("<!-- %s -->\n","今回の\$hist=".$hist);
?>

※申し訳ありませんが、RESは来週になるかもしれません。
以上、よろしくお願いいたします。