セッションの使用


  初期画面への画面遷移実装とソースコードの整備




グループ(1)



グループ(2)



  

<?
require_once( "function.php" );
# **********************************************************
# 画面表示前のサーバ側の処理
# **********************************************************
	$Sel[$_POST['kubun']] = 'selected';		# コンボボックスの復帰

	# 初期画面の表示
	if ( strtoupper( $_SERVER['REQUEST_METHOD'] ) == 'GET' ) {
		SetGroup( 1 );
	}
	# 入力処理
	else {
		switch ( $_POST['Group'] ) {
			# 初期画面よりの入力
			case 1:
				# エラーチェック
				$_POST['MainKey'] = trim( $_POST['MainKey'] );
				if ( $_POST['MainKey'] == '' ) {
					SetErrMessage( '空白文字が入力されました' );
				}

				if ( $ErrMessage == '' ) {		# エラー無し
					$HideElement = '<INPUT name=kubun type=hidden value="';
					$HideElement .= $_POST['kubun'];
					$HideElement .= '">';
					SetGroup( 2 );
				}
				else {	# エラー有り
					SetGroup( 1 );
				}
				break;

			# 第2画面よりの入力
			case 2:
				if ( $ErrMessage == '' ) {		# エラー無し
					header( "Location: {$_ENV['HTTP_REFERER']}" );
					exit();
				}
				else {	# エラー有り
					SetGroup( 2 );
				}
				break;
		}

	}


# **********************************************************
# クライアント側に表示される画面
# **********************************************************
?>
<SCRIPT language=JavaScript>
var ClickedButton;
function CheckData() {

	if ( ClickedButton == 1 ) {
		if ( document.all.item("MainKey").value == "" ) {
			alert( "データを入力して下さい" );
			document.all.item("MainKey").focus();
			return false;
		}
	}

	return true;
}
</SCRIPT>

<? require_once( "pagestart.php" ); ?>
<!-- *******************************************************
 送信フォーム
******************************************************** -->
<FORM
	name=frmMain
	method=post
	action=<?= $_SERVER['SCRIPT_NAME'] ?>
	onSubmit='return CheckData();'
>

	<INPUT name=Group type=hidden value="<?= $CurrentGROUP ?>">
	<?= $HideElement ?>

	<!-- ****** 処理区分 ****** -->
	<SELECT name=kubun <?= $GROUP1 ?>>
	<OPTION value=1 <?= $Sel[1] ?>>登録
	<OPTION value=2 <?= $Sel[2] ?>>修正
	<OPTION value=3 <?= $Sel[3] ?>>削除
	</SELECT><BR>

	<!-- ****** キー入力 ****** -->
	<INPUT name=MainKey type=text
		value="<?= $_POST['MainKey'] ?>"
		<?= $GROUPtext1 ?>
	>

	<!-- ****** 第1送信 ****** -->
	<INPUT name=SendButton type=submit
		value="送信"
		<?= $GROUP1 ?>
		onClick='ClickedButton=1;'
	>

	<!-- ****** エラーメッセージ表示用 ****** -->
	<BR><?= $ErrMessage ?>

	<HR size=1 color=black>

	<!-- ****** データ入力 ****** -->
	<INPUT name=Data1 type=text <?= $GROUPtext2 ?>><BR>
	<INPUT name=Data2 type=text <?= $GROUPtext2 ?>><BR>

	<!-- ****** 第2送信 ****** -->
	<INPUT name=SendButton type=submit
		value="送信"
		<?= $GROUP2 ?>
		onClick='ClickedButton=2;'
	>

	<!-- ****** 第2画面キャンセル用 ****** -->
	<INPUT
		name=CancelButton type=button
		value="キャンセル"
		<?= $GROUP2 ?>
		onClick='location="<?= $_SERVER['SCRIPT_NAME'] ?>";'
	>

</FORM>
<? require_once( "pageend.php" ); ?>

<?
	DispPost();
?>
  







  セッション使用の目的

Webページでは画面から画面へのデータの受け渡しに隠しフィールドやURLにQueryStringを追加して行ないます。しかし、通常この作業はプログラマにまかされる為、煩雑な上に間違いを生じやすく、また、隠しフィールド等では実現不可能な処理を行なうWebアプリケーションも存在する為、通常Webアプリケーションでは最初に「セッション」の使用を検討しなければなりません。

但し、セッションの使用はブラウザ側の「クッキー」が有効となっている事が前提なので、ページを読むユーザによっては実現が不可能となります。

  セッションの開始

セッションの開始は以下の関数で行ないます。

bool session_start ( void )

session_start() は、セッションを作成します。 (もしくは、リクエスト上でGET,POSTまたはクッキーにより渡されたセッションIDセッショ ンに基づき現在のセッションを復帰します)

名前付きのセッションを使用したい場合、 session_start()の前に session_name()をコールする必要があります。

この関数は常に TRUE を返します。

※ クッキーに基づくセッションを使用している場合、ブラウザに何か出力 を行う前にsession_start()をコールする必要があ ります。

php.exe によるセッションはファイルに書き込まれる為、書き込む為のディレクトリを作成しておく必要があります。その場所は、php.ini の session.save_path にセットされますが、デフォルトで /tmp となっている為、スクリプトと同じドライブのルートに TMP ディレクトリを作成して下さい。

  セッションに変数を登録するには

結論から言うと、$_SESSION スーパーグローバルに直接セットします。

register_globalsを 考慮することなくスクリプトを書きたい場合には、 $_SESSION配列を 代わりに使用する必要があります。 $_SESSIONのエントリーは自動的に登録されます。 スクリプトでsession_register()を 使用している場合には、それは register_globalsを 不可としている環境下では動作しません。

よって、セッション変数の初期化は以下のように書きます

  

$_SESSION = array();

  


  現在の処理で保持したい値は

  • 処理区分
  • キーの値
  • カレントの画面状態(画面グループ)

  • の3つです。これらをセッション変数とする事によって、隠しフィールド
    による値の保持は不要となります。

      
    
    $HideElement = '<INPUT name=kubun type=hidden value="';
    $HideElement .= $_POST['kubun'];
    $HideElement .= '">';
    
    の処理と
    
    <INPUT name=Group type=hidden value="<?= $CurrentGROUP ?>">
    
    が不要になります
    
      

      SetGroup関数の変更

      
    
    # **********************************************************
    # グループ処理
    # **********************************************************
    function SetGroup( $Group ) {
    
    	switch ( $Group ) {
    		case 1:
    #			$GLOBALS['CurrentGROUP'] = 1;
    			$_SESSION = array(); 
    			$_SESSION['Group'] = 1;
    			$GLOBALS['GROUP1'] = '';
    			$GLOBALS['GROUPtext1'] = '';
    			$GLOBALS['GROUP2'] = 'disabled';
    			$GLOBALS['GROUPtext2'] = 'readonly';
    			break;
    		case 2:
    #			$GLOBALS['CurrentGROUP'] = 2;
    			$_SESSION['Group'] = 2;
    			$GLOBALS['GROUP1'] = 'disabled';
    			$GLOBALS['GROUPtext1'] = 'readonly';
    			$GLOBALS['GROUP2'] = '';
    			$GLOBALS['GROUPtext2'] = '';
    			break;
    	}
    
    }
    
      

      入力処理の変更

      
    
    # 初期画面の表示
    if ( strtoupper( $_SERVER['REQUEST_METHOD'] ) == 'GET' ) {
    	SetGroup( 1 );
    }
    # 入力処理
    else {
    	switch ( $_SESSION['Group'] ) {
    		# 初期画面よりの入力
    		case 1:
    			# エラーチェック
    			$_POST['MainKey'] = trim( $_POST['MainKey'] );
    			if ( $_POST['MainKey'] == '' ) {
    				SetErrMessage( '空白文字が入力されました' );
    			}
    
    			if ( $ErrMessage == '' ) {	# エラー無し
    				$_SESSION['Mode'] = $_POST['kubun'];
    				$_SESSION['Key'] = $_POST['MainKey'];
    				SetGroup( 2 );
    			}
    			else {	# エラー有り
    				SetGroup( 1 );
    			}
    			break;
    
    		# 第2画面よりの入力
    		case 2:
    			if ( $ErrMessage == '' ) {	# エラー無し
    				header( "Location: {$_ENV['HTTP_REFERER']}" );
    				exit();
    				SetGroup( 2 );
    			}
    			else {	# エラー有り
    				SetGroup( 2 );
    			}
    			break;
    	}
    }
    
    $Sel[$_SESSION['Mode']] = 'selected';	# コンボボックスの復帰
    
      

    コンボボックスの復帰が最後になっているのは、$_SESSION['Mode']の内容
    によって復帰させている為です。




    yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


    [pgdojo]
    claudebot
    24/03/28 18:41:21
    InfoBoard Version 1.00 : Language=Perl

    1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube