情報学部 菅沼ホーム 目次 索引

PHP の使用例( PHP と HTML )

      1. データの送信とファイルのアップロード
      2. URL のパラメータ
      3. 演習問題の解答
      4. ラジオボタン,チェックボックス,ドロップダウンリスト
      5. ユーザの認証
      6. クッキーとセッション

  1. データの送信とファイルのアップロード

      PHP は,サーバ側で実行されるため,PHP で書かれたプログラム(ファイル)を CGI としても利用可能です.この例( test.htm )では,2 つの FORM 要素が使用されています.上のフォームにおける「送信」ボタンをクリックすると,12 行目の ACTION 属性に記述された test1.php に移動します.また,下のフォームにおける「アップロード」ボタンをクリックすると,test2.php に移動し,ファイルがアップロードされます.

      なお,CGI との関係については,FORM 要素の使用例1(データの受け渡し)も参考にして下さい.

    test.htm

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>フォームと PHP</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    08	</HEAD>
    09	<BODY CLASS="white">
    10		<H1 STYLE="text-align: center">フォームと PHP</H1>
    11		<HR>
    12		<P STYLE="text-align: center">フォームデータ</P>
    13		<FORM NAME="form1" ACTION="test1.php" METHOD="post">
    14			<P STYLE="text-align: center">
    15				名前: <INPUT TYPE="text" NAME="name" STYLE="font-size: 90%">  
    16				性別: <INPUT TYPE="radio" NAME="sex" VALUE="Male"> 男性 
    17				<INPUT TYPE="radio" NAME="sex" VALUE="Female"> 女性<BR>
    18				メッセージ: <TEXTAREA NAME="message" ROWS="2" COLS="30" STYLE="font-size: 90%"></TEXTAREA><BR>
    19				<INPUT TYPE="submit" VALUE="送信" STYLE="font-size: 90%"> <INPUT TYPE="reset" STYLE="font-size: 90%">
    20			</P>
    21		</FORM>
    22		<HR>
    23		<P STYLE="text-align: center">ファイルのアップロード</P>
    24		<FORM NAME="form2" ENCTYPE="multipart/form-data" ACTION="test2.php" METHOD="post">
    25			<P STYLE="text-align: center">
    26				<INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="10000000" >
    27				<INPUT TYPE="file" NAME="file_name" STYLE="font-size: 90%">
    28				<INPUT TYPE="submit" VALUE="アップロード" STYLE="font-size: 90%">
    29			</P>
    30		</FORM>
    31	</BODY>
    32	</HTML>
    			
    13 行目~ 21 行目

      上側のフォームに対応する部分である.「送信」ボタンをクリックすると,14 行目~ 18 行目の内容が test1.php に送られる.13 行目において,METHOD 属性として post が指定されているため,結果は,定義済み変数の一つである $_POST に入れられる( METHOD 属性が get の場合は $_GET ).

    24 行目~ 30 行目

      下側のフォームに対応する部分である.「アップロード」ボタンをクリックすると,27 行目で指定したファイルが test2.php によってアップロードされる.ただし,この場合は,定義済み変数 $_FILES にアップロードするファイル名等が保存され引き渡される.なお,26 行目では,アップロードできるファイルの最大サイズを指定している.

    test1.php

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>フォームデータ</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../master.css">
    08	</HEAD>
    09	<BODY CLASS="white">
    10		<H1 STYLE="text-align: center">フォームデータ</H1>
    11		<DL>
    12			<DD>$_POST['name']: <?php echo $_POST['name'] ?>
    13			<DD>$_POST['sex']: <?php echo $_POST['sex'] ?>
    14			<DD>$_POST['message']: <?php echo $_POST['message'] ?>
    15		</DL>
    16	</BODY>
    17	</HTML>
    			
    12 行目~ 14 行目

      test.htm から送られてきた内容を表示している.このように,変数 $_POST に入れられた内容は,各要素の NAME 属性に設定された値をキーとして参照することが可能である.例えば,名前に「菅沼 義昇」をセットし,男性を選び,かつ,メッセージに「test message テストメッセージ」をセットし送信したとき,test1.php を表示した結果は以下に示すようになる.
      $_POST['name']: 菅沼 義昇 
      $_POST['sex']: Male 
      $_POST['message']: test message テストメッセージ 				

    test2.php

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>アップロード結果</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../master.css">
    08	</HEAD>
    09	<BODY CLASS="white">
    10		<H1 STYLE="text-align: center">アップロード結果</H1>
    11		<DL>
    12		<?php
    13			$uploadfile  = "./".$_FILES['file_name']['name'];
    14			if (move_uploaded_file($_FILES['file_name']['tmp_name'], $uploadfile)) {
    15		?>
    16				<DD>$_FILES['file_name']['name']: <?php echo $_FILES['file_name']['name'] ?>
    17				<DD>$_FILES['file_name']['type']: <?php echo $_FILES['file_name']['type'] ?>
    18				<DD>$_FILES['file_name']['tmp_name']: <?php echo $_FILES['file_name']['tmp_name'] ?>
    19				<DD>$_FILES['file_name']['error']: <?php echo $_FILES['file_name']['error'] ?>
    20				<DD>$_FILES['file_name']['size']: <?php echo $_FILES['file_name']['size'] ?>
    21				<DT>ファイル <?php echo $_FILES['file_name']['name'] ?> をアップロードしました.
    22		<?php
    23			}
    24		?>
    25		</DL>
    26	</BODY>
    27	</HTML>
    			
    13 行目

      move_uploaded_file 関数を利用してファイルをアップロードし,成功した場合は,以下のメッセージを出力する.

    16 行目~ 21 行目

      アップロードに関する情報は,定義済み変数の一つである $_FILESに入れられる.ここでは,変数 $_FILES の内容を表示している.例えば,ファイル general.htm をアップロードした場合は,以下に示すような結果が表示される(実際は,書き込み制限のためこのページでは実行できない).
      	$_FILES['file_name']['name']: general.htm 
      	$_FILES['file_name']['type']: text/html 
      	$_FILES['file_name']['tmp_name']: /tmp/phpgNN2BH 
      	$_FILES['file_name']['error']: 0 
      	$_FILES['file_name']['size']: 4604 
      ファイル general.htm をアップロードしました				

  2. URL のパラメータ
      CGI の目的は,送られてきたデータを受け取り,何らかの処理を行った後,その結果を別のページに反映させることです.単に,特定のデータを指定したページに受け渡すだけであれば,下に示す例のように,URL の最後に ? をつけて受け渡したいパラメータを記述することによって可能です.ここをクリックすると,
    <A HREF="form/test3.php?par1=10&par2=abc">			
    という記述によって,2 つのパラメータ par1 と para2 を,test3.php に送っています.test3.php は,受け取ったパラメータを表示しているだけであり,以下に示すように,METHOD="get" の場合に対する CGI プログラムと全く同じものです.

    test3.php

    <!DOCTYPE HTML>
    <HTML>
    <HEAD>
    	<TITLE>データの受け渡し</TITLE>
    	<LINK REL="stylesheet" TYPE="text/css" HREF="../../master.css">
    	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
    	<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    </HEAD>
    <BODY CLASS="white">
    	<H1 CLASS="center">送信されたデータ</H1>
    	<PRE>
    		<?php
    			print_r($_GET);
    		?>
    	</PRE>
    </BODY>
    </HTML>
    			

  3. 演習問題の解答

      HTML に対する説明で述べた「演習問題の解答」に,JavaScript に対する説明で述べた「演習問題の解答(チェック)」機能を付加し,かつ,CGI プログラムとして PHP で書かれたプログラムを使用してみます.このとき,HTML ファイルのソースは以下のようになります.FORM 要素ACTION 属性を check1.php にした以外ほとんど変わっていません.

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>入力されたか否かのチェック</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    08		<SCRIPT TYPE="text/javascript">
    09			function check(form) {
    10				if(form.ans.value =="") {
    11					alert("答えを入力してください");   // ダイアログの表示
    12					return false;
    13				}
    14				if(form.name.value =="") {
    15					alert("名前を入力してください");   // ダイアログの表示
    16					return false;
    17				}
    18			}
    19		</SCRIPT>
    20	</HEAD>
    21	<BODY CLASS="white">
    22		<H3 STYLE="text-align:center">次の問題の答えは?</H3>
    23		<FORM ACTION="check1.php" METHOD="post">
    24			<P STYLE="text-align:center">
    25				3 + 4 = <INPUT TYPE="text" NAME="ans" STYLE="font-size:90%"><BR><BR>
    26				名前:<INPUT TYPE="text" NAME="name" STYLE="font-size:90%">  
    27				<INPUT TYPE="submit" VALUE="送信" onClick="return check(this.form)" STYLE="font-size:90%"><BR>
    28				<INPUT TYPE="hidden" NAME="a" VALUE="3">
    29				<INPUT TYPE="hidden" NAME="b" VALUE="4">
    30			</P>
    31		</FORM>
    32	</BODY>
    33	</HTML>
    			
    10 行目~ 13 行目

      答えが入力されているか否かのチェックを行っている.

    14 行目~ 17 行目

      名前が入力されているか否かのチェックを行っている.

    27 行目

      「送信」ボタンがクリックされたとき,そのまま送信するのではなく,関数 check ( 09 行目~ 18 行目)を呼ぶように設定している.この結果,答えや名前が入力されていないと送信されず,警告ダイアログが表示されることになる.

      このとき,check1.php は以下のようになります.送信されたデータが配列 $_POST に入れられて受け渡される点に注意してください.では,表示して実行し,正解のとき,及び,間違ったとき実際に表示されるページとそのソースを確認してみてください.

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>演習問題の解答</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    08	</HEAD>
    09	<BODY CLASS="white">
    10		<?php
    11			if ($_POST['a']+$_POST['b'] == $_POST['ans']) {
    12				printf("<H3 STYLE=\"text-align:center\">%s さん,正解です!</H3>\n", $_POST['name']);
    13				printf("		<H3 STYLE=\"text-align:center\">続いて,次の問題の答えは?</H3>\n");
    14				srand();
    15				$a = floor(rand() / getrandmax() * 100);
    16				$b = floor(rand() / getrandmax() * 100);
    17			}
    18			else {
    19				printf("<H3 STYLE=\"text-align:center\">%s さん,間違っています!</H3>\n", $_POST['name']);
    20				printf("		<H3 STYLE=\"text-align:center\">もう一度計算してみて下さい</H3>\n");
    21				$a = $_POST['a'];
    22				$b = $_POST['b'];
    23			}
    24		?>
    25		<FORM ACTION="check1.php" METHOD="post">
    26			<P STYLE="text-align:center">
    27				<?php echo $a." + ".$b ?> = <INPUT TYPE="text" NAME="ans" STYLE="font-size:90%"><BR><BR>
    28				名前:<INPUT TYPE="text" NAME="name" STYLE="font-size:90%">  
    29				<INPUT TYPE="submit" VALUE="送信" STYLE="font-size:90%"><BR>
    30				<INPUT TYPE="hidden" NAME="a" VALUE="<?php echo $a ?>">
    31				<INPUT TYPE="hidden" NAME="b" VALUE="<?php echo $b ?>">
    32			</P>
    33		</FORM>
    34	</BODY>
    35	</HTML>
    			
    11 行目~ 17 行目

      正解か否かのチェックを行い,正解である場合の処理である.メッセージを出力し( 12 行目~ 13 行目),次の問題をランダムに生成している( 14 行目~ 16 行目).

    18 行目~ 23 行目

      不正解である場合の処理であり,メッセージを出力した後,同じ問題を設定している.

    27 行目~ 31 行目

      結果に従って,問題画面を表示している.

  4. ラジオボタン,チェックボックス,ドロップダウンリスト

      ここに示す例は,JavaScript に対する説明で使用した「ラジオボタン,チェックボックス,ドロップダウンリスト(確認)」とほとんど同じものです. → 表示

    check2.htm
    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>送信内容の確認</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    08		<SCRIPT TYPE="text/javascript">
    09			sw1 = 0;
    10			sw2 = 0;
    11			sw3 = 0;
    12			function sel(sw) {
    13				if (sw == 1)
    14					sw1 = 1;
    15				else if (sw == 2)
    16					sw2 = 1;
    17				else
    18					sw3 = 1;
    19			}
    20			function check(form) {
    21				if (sw1 == 0) {
    22					alert("性別を選択してください");
    23					return false;
    24				}
    25				else if (sw2 == 0) {
    26					alert("好きな野菜を選択してください");
    27					return false;
    28				}
    29				else if (sw3 == 0) {
    30					alert("好きな果物を選択してください");
    31					return false;
    32				}
    33				else if(form.name.value =="") {
    34					alert("名前を入力してください");
    35					return false;
    36				}
    37				else {
    38					let str = "名前: "+form.name.value+"\n";
    39					if (form.elements[1].checked)
    40						str += "性別: 男性\n";
    41					else
    42						str += "性別: 女性\n";
    43					str += "好きな野菜:";
    44					if (form.c1.checked)
    45						str += " キャベツ";
    46					if (form.c2.checked)
    47						str += " 大根";
    48					if (form.c3.checked)
    49						str += " ジャガイモ";
    50					if (form.c4.checked)
    51						str += " トマト";
    52					str += "\n";
    53					str += "好きな果物:";
    54					if (form.list.options[0].selected)
    55						str += " 蜜柑";
    56					else if (form.list.options[1].selected)
    57						str += " 林檎";
    58					else
    59						str += " 葡萄";
    60					let result = confirm(str);
    61					if (result == true)
    62						return true;
    63					else
    64						return false;
    65				}
    66			}
    67		</SCRIPT>
    68	</HEAD>
    69	<BODY STYLE="font-size:130%; background-color: #eeffee">
    70		<H1 STYLE="text-align: center">フォームの例2</H1>
    71		<FORM ACTION="form2.php" METHOD="post">
    72			<DL>
    73				<DT>名前: <INPUT TYPE="text" NAME="name" STYLE="font-size:90%">
    74				<DT>性別:
    75				<DD><INPUT TYPE="radio" NAME="sex" VALUE="Male" onClick="sel(1)">男性
    76				<DD><INPUT TYPE="radio" NAME="sex" VALUE="Female" onClick="sel(1)">女性
    77				<DT>好きな野菜:
    78				<DD><INPUT TYPE="checkbox" NAME="c1" onClick="sel(2)">キャベツ
    79				<DD><INPUT TYPE="checkbox" NAME="c2" onClick="sel(2)">大根
    80				<DD><INPUT TYPE="checkbox" NAME="c3" onClick="sel(2)">ジャガイモ
    81				<DD><INPUT TYPE="checkbox" NAME="c4" onClick="sel(2)">トマト
    82				<DT>好きな果物:
    83				<DD><SELECT NAME="list" onClick="sel(3)" STYLE="font-size:90%">
    84					<OPTION VALUE="s1">蜜柑</OPTION>
    85					<OPTION VALUE="s2">林檎</OPTION>
    86					<OPTION VALUE="s3">葡萄</OPTION>
    87				</SELECT>
    88			</DL>
    89			<P STYLE="text-align: center"><INPUT TYPE="submit" VALUE="送信" onClick="return check(this.form)" STYLE="font-size:90%"></P>
    90		</FORM>
    91	</BODY>
    92	</HTML>
    			
    12 行目~ 19 行目

      ラジオボタン,チェックボックス,及び,ドロップダウンリストの項目が選択されたとき呼ばれる関数である.ラジオボタンの項目が選択されると sw1 の値が 1 に,チェックボックスの項目が選択されると sw2 の値が 1 に,また,ドロップダウンリストの項目が選択されると sw3 の値が 1 に設定される.09 行目~ 11 行目において,sw1,sw2,及び,sw3 の値はすべて 0 に設定されているため,これらの値によって,各項目が選択されていることの確認が可能になる.

    20 行目~ 66 行目

      「送信」ボタンがクリックされたとき,呼ばれる関数である.21 行目~ 32 行目においては,ラジオボタン,チェックボックス,及び,ドロップダウンリストの項目が選択されているか否かを調べ,33 行目~ 36 行目において,名前が入力されているか否かをチェックしている.38 行目以降はすべての項目が入力されている場合に対する処理であり.入力された項目を文字列 str に設定し,60 行目の confirm メソッドで確認を行っている.

      以下に示すのが,form2.php のソースプログラムです.実際に行っていることは,12 行目~ 18 行目において,送信がされてきた内容を画面に表示しているだけです.

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>ラジオボタン,チェックボックス,ドロップダウンリスト</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    08	</HEAD>
    09	<BODY CLASS="white">
    10		<H1 STYLE="text-align: center">送信されたデータ</H1>
    11	<?php
    12		printf("		名前: %s<BR>\n", $_POST['name']);
    13		printf("		性別: %s<BR>\n", $_POST['sex']);
    14		printf("		好きな野菜 c1 : %s<BR>\n", $_POST['c1']);
    15		printf("		好きな野菜 c2 : %s<BR>\n", $_POST['c2']);
    16		printf("		好きな野菜 c3 : %s<BR>\n", $_POST['c3']);
    17		printf("		好きな野菜 c4 : %s<BR>\n", $_POST['c4']);
    18		printf("		好きな果物: %s<BR>\n", $_POST['list']);
    19	?>
    20	</BODY>
    21	</HTML>
    			

  5. ユーザの認証

      ユーザ認証を行う最も簡単な方法は,以下の例に示すように JavaScript を使用することです.しかし,この例からも明らかなように,ソースファイルを見ればユーザ ID もパスワードもわかってしまいます( JavaScript を別のファイルにすれば多少は見にくくなりますが).しかし,この程度のチェックで十分な場合もあるかと思います.では,実際に,実行してみてください.

    <!DOCTYPE HTML>
    <HTML>
    <HEAD>
    	<TITLE>ユーザ認証</TITLE>
    	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    	<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    	<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    	<SCRIPT TYPE="text/javascript">
    		function check(form) {
    			if (form.name.value != "user" || form.pass.value != "ps_word") {
    				alert("正しいユーザIDとパスワードを入力してください");
    				return false;
    			}
    			else
    				alert("OKです!");
    		}
    	</SCRIPT>
    </HEAD>
    <BODY CLASS="white">
    	<H1 STYLE="text-align: center">ユーザ認証</H1>
    	<FORM>
    		<DL>
    			<DT>ユーザID: <INPUT TYPE="text" NAME="name" STYLE="font-size:90%">
    			<DT>パスワード: <INPUT TYPE="password" NAME="pass" STYLE="font-size:90%">
    		</DL>
    		<P STYLE="text-align: center"><INPUT TYPE="submit" VALUE="送信" onClick="return check(this.form)" STYLE="font-size:90%"></P>
    	</FORM>
    </BODY>
    </HTML>
    			

      やはり,正式にユーザ認証を行うためには,サーバ側で実行する必要があります.サーバ側にユーザ ID とパスワードを記録しておき,そのデータに基づいてユーザ認証を行うことになります.もちろん,パスワードは暗号化した形で記録しておきます.そのためには,まず,ユーザの追加を行う必要があります.以下に示すのはユーザ ID とパスワードを入力するためのページ( user_add.htm )と,入力されたデータに基づいてユーザの追加を行う PHP のプログラム( user_add.php )の例です. → 表示

    user_add.htm

    <!DOCTYPE HTML>
    <HTML>
    <HEAD>
    	<TITLE>ユーザの追加</TITLE>
    	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    	<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    	<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    	<SCRIPT TYPE="text/javascript">
    		function check() {
    			if(document.add_form.user.value =="")
    			{
    				alert("ユーザ ID を入力してください");
    				return false;
    			}
    			if(document.add_form.password.value =="")
    			{
    				alert("パスワードを入力してください");
    				return false;
    			}
    		}
    	</SCRIPT>
    </HEAD>
    <BODY CLASS="white">
    	<H1 STYLE="text-align: center">ユーザの追加</H1>
    	<FORM NAME="add_form" ACTION="user_add.php" METHOD="post">
    		<P STYLE="text-align: center">
    			ユーザ: <INPUT TYPE="text" NAME="user" STYLE="font-size:90%"><BR>
    			パスワード: <INPUT TYPE="password" NAME="password" STYLE="font-size:90%"><BR><BR>
    			<INPUT TYPE="submit" VALUE="送信" onClick="return check()" STYLE="font-size:90%">
    		</P>
    	</FORM>
    </BODY>
    </HTML>
    			

    user_add.php

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>ユーザの追加</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    08	</HEAD>
    09	<BODY CLASS="white">
    10	
    11	<?php
    12		$sw = 0;
    13		$in = fopen("user_list", "rb");
    14		$k  = 0;
    15		while (fscanf($in, "%s %s", $user[$k], $pass[$k]) && $sw == 0) {
    16			if ($user[$k] == $_POST['user'])
    17				$sw = 1;
    18			$k++;
    19		}
    20		fclose($in);
    21	
    22		if ($sw == 0) {
    23			$p   = crypt($_POST['password']);
    24			$out = fopen("user_list", "ab");
    25			$str = $_POST['user']." ".$p."\n";
    26			fwrite($out, $str);
    27			fclose($out);
    28		}
    29	
    30		if ($sw == 0)
    31			printf("		<H2 STYLE=\"text-align: center\">ユーザ %s を追加しました</H2>\n", $_POST['user']);
    32		else
    33			printf("		<H2 STYLE=\"color: red; text-align: center\">ユーザ %s は既に存在します</H2>\n", $_POST['user']);
    34	?>
    35	
    36	</BODY>
    37	</HTML>
    			
    13 行目

      ファイル user_list を読み込みモードで開く.

    15 行目~ 19 行目

      ファイル user_list からユーザ名を読み込み,送信されてきたユーザ名と同じユーザ名が存在した場合は,変数 $sw を 1 に設定している.

    20 行目

      ファイル user_list を閉じる.

    23 行目

      送信されてきたパスワードを文字列関数の中の crypt を使用して暗号化している.以下,27 行目までは,同じユーザ名が存在しなかった場合に対する処理である.

    24 行目

      ファイル user_list を追加書き込みモードで開く.

    25 行目~ 26 行目

      ユーザ名と暗号化されたパスワードをファイル user_list に書き込む.

    27 行目

      ファイル user_list を閉じる.

    30 行目~ 33 行目

      同じユーザ名が存在しなかった場合は成功,そうでない場合は失敗を表すメッセージを表示している.

      これで準備ができましたので,実際にユーザ認証を行ってみましょう.以下に示すのはユーザ ID とパスワードを入力するためのページ( user_recog2.htm )と,そのデータに基づいてユーザ認証を行う PHP のプログラム( user_recog2.php )の例です. → 認証

    user_recog2.htm

    <!DOCTYPE HTML>
    <HTML>
    <HEAD>
    	<TITLE>ユーザ認証</TITLE>
    	<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    	<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    	<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    	<SCRIPT TYPE="text/javascript">
    		function check() {
    			if(document.pass_form.user.value =="")
    			{
    				alert("ユーザ ID を入力してください");
    				return false;
    			}
    			if(document.pass_form.password.value =="")
    			{
    				alert("パスワードを入力してください");
    				return false;
    			}
    		}
    	</SCRIPT>
    </HEAD>
    <BODY  CLASS="white">
    	<H1 STYLE="text-align: center">ユーザ認証</H1>
    	<FORM NAME="pass_form" ACTION="user_recog2.php" METHOD="post">
    		<P STYLE="text-align: center">
    			ユーザ: <INPUT TYPE="text" NAME="user" STYLE="font-size:90%"><BR>
    			パスワード: <INPUT TYPE="password" NAME="password" STYLE="font-size:90%"><BR>
    			<INPUT TYPE="submit" VALUE="送信" onClick="return check()" STYLE="font-size:90%">
    		</P>
    	</FORM>
    </BODY>
    </HTML>
    			

    user_recog2.php

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>ユーザ認証</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
    06		<META NAME=viewport CONTENT="width=device-width, initial-scale=1">
    07		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
    08	</HEAD>
    09	<BODY CLASS="white">
    10	
    11	<?php
    12		$sw = 0;
    13		$in = fopen("user_list", "rb");
    14		while (fscanf($in, "%s %s", $user, $pass)) {
    15			if ($user == $_POST['user']) {
    16				if (crypt($_POST['password'], $pass) == $pass) {
    17					$sw = 1;
    18					break;
    19				}
    20			}
    21		}
    22		fclose($in);
    23	
    24		if ($sw > 0)
    25			printf("		<H2 STYLE=\"text-align: center\">ユーザ %s を認識しました</H2>\n", $_POST['user']);
    26		else
    27			printf("		<H2 STYLE=\"color: red; text-align: center\">正しいユーザ名とパスワードを入力してください</H2>\n");
    28	?>
    29	
    30	</BODY>
    31	</HTML>
    			
    14 行目~ 21 行目

      ファイル user_list から,ユーザ名 $user と暗号化されたパスワード $pass を順に読み込み( 14 行目),ユーザ名とパスワードを比較し( 15,16 行目),それらが一致した場合は,変数 $sw の値を 1 に設定している( 17 行目).この結果は,24 行目~ 27 行目で表示される.

  6. クッキーとセッション

      JavaScript で説明した「クッキーの利用例(ショッピング)」では,クッキーを利用して商品情報を保存しました.もちろん,PHP においても,「クッキーとその利用方法」において説明した「 PHP による方法」に従って,JavaScript の場合と同様のプログラムを書けますが,ここでは,PHP のセッション機能を利用して商品情報を保存してみます.セッションとは,クッキーと同様,サーバとクライアント間において複数回やりとりした情報を一時的に保存するための機能です.セッションとクッキーの違いは,クッキーはクライアント側で情報を保存しますが,セッションではサーバー側で情報を保存します.そのため,サーバーはリクエストがあったクライアントに対して,セッション ID というものをだし,各クライアントを識別します.なお,セッションに関する情報は,定義済み変数の一つである $_SESSIONに入れられる.

      最初のプログラム( session_buy.htm )は,商品の購入又はデータの破棄を行うためのトップページです.このページにおいて,「データの破棄」ボタンをクリックすると 2 番目のプログラム( session_del.php )に,また,「購入」ボタンをクリックすると 3 番目のプログラム( session_buy.php )に移動します.また,3 番目のプログラムにおいて,「確認」をクリックすると 4 番目のプログラム( session_check.php )に移動し,購入したすべての商品の確認を行うことができます.さらに購入を続けたい場合は,4 番目のプログラムにおいて,「追加購入」をクリックし 1 番目のプログラムに戻ります.

    session_buy.htm: 商品の選択と購入,データの破棄

    01	<!DOCTYPE HTML>
    02	<html>
    03	<head>
    04		<title>商品の購入</title>
    05		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    06		<meta name=viewport Content="width=device-width, initial-scale=1">
    07		<link rel="stylesheet" type="text/css" href="../../../master.css">
    08	</head>
    09	<body class="white">
    10		<h1 class="center">商品の購入</h1>
    11		<form action="session_buy.php" method="post">
    12			<p class="center">
    13				商品名:<input type="text" name="article" style="font-size: 90%"> 
    14				タイプ:<input type="text" name="type" style="font-size: 90%"> 
    15				<input type="submit" value="購入" style="font-size: 90%">
    16			</p>
    17		</form>
    18		<form action="session_del.php" method="post">
    19			<p class="center">
    20				<input type="submit" value="データ破棄" style="font-size: 90%">
    21			</p>
    22		</form>
    23	</body>
    24	</html>
    			
    13 行目~ 15 行目

      商品名とタイプに適当な文字列を入力し,「購入」ボタンをクリックすると, session_buy.php に移動し,購入処理(セッションへのデータ追加)が実行されます.

    20 行目

      「データ破棄」ボタンをクリックすると, session_del.php に移動し,すべてのセッションデータが削除されます.

    session_del.php: セッションデータの破棄

    01	<?php
    02		session_start();
    03	?>
    04	<!DOCTYPE HTML>
    05	<html>
    06	<head>
    07		<title>データの破棄</title>
    08		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    09		<meta name=viewport Content="width=device-width, initial-scale=1">
    10		<link rel="stylesheet" type="text/css" href="../../../master.css">
    11	</head>
    12	<body class="white">
    13		<h1 class="center">データの破棄</h1>
    14		<dl>
    15	<?php
    16		unset($_SESSION['ss']);
    17		printf("		<dt>すべてのデータを破棄しました\n");
    18	?>
    19		</dl>
    20	</body>
    21	</html>
    			
    02 行目

      セッションを初期化

    16 行目

      変数 $_SESSION['ss'] の割り当てを解除

    session_buy.php: 購入手続き

    01	<?php
    02		session_start();
    03	?>
    04	<!DOCTYPE HTML>
    05	<html>
    06	<head>
    07		<title>商品の購入手続き</title>
    08		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    09		<meta name=viewport Content="width=device-width, initial-scale=1">
    10		<link rel="stylesheet" type="text/css" href="../../../master.css">
    11	</head>
    12	<body class="white">
    13		<h1 class="center">商品の購入手続き</h1>
    14		<dl>
    15	<?php
    16		if (!isset($_SESSION['ss'])) {
    17			$k = 0;
    18			$_SESSION['ss'][0] = $_POST['article'];
    19			$_SESSION['ss'][1] = $_POST['type'];
    20		}
    21		else {
    22			$k = count($_SESSION['ss']);
    23			$_SESSION['ss'][$k]   = $_POST['article'];
    24			$_SESSION['ss'][$k+1] = $_POST['type'];
    25		}
    26		printf("		<dt>次の商品の購入手続きを行いました\n");
    27		printf("		<p>\n");
    28		printf("		<dd>商品名:%s, タイプ:%s ", $_SESSION['ss'][$k], $_SESSION['ss'][$k+1]);
    29	?>
    30			<a href="session_check.php">確認</a>
    31		</dl>
    32	</body>
    33	</html>
    			
    16 行目~ 20 行目

      変数 $_SESSION['ss'] が設定されているかどうかを調べ,設定されていない場合は,最初のデータをセッションに保存

    21 行目~ 25 行目

      変数 $_SESSION['ss'] が設定されている場合の処理であり,新たに購入された商品を追加している.この例では,同じ商品か否かのチェックは行っていない.なお,count配列関数の一つであり,配列の要素数を返す.

    session_check.php: 購入した商品の確認,追加購入

    01	<?php
    02		session_start();
    03	?>
    04	<!DOCTYPE HTML>
    05	<html>
    06	<head>
    07		<title>購入商品の確認</title>
    08		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    09		<meta name=viewport Content="width=device-width, initial-scale=1">
    10		<link rel="stylesheet" type="text/css" href="../../../master.css">
    11	</head>
    12	<body class="white">
    13		<h1 class="center">購入商品の確認</h1>
    14		<dl>
    15	<?php
    16		printf("		<dt>次の商品を購入しています\n");
    17		printf("		<p>\n");
    18		$n = count($_SESSION['ss']) / 2;
    19		for ($i1 = 0; $i1 < $n; $i1++) {
    20			$k = 2 * $i1;
    21			printf("		<dd>%d. 商品名:%s, タイプ:%s<br>\n", $i1+1, $_SESSION['ss'][$k], $_SESSION['ss'][$k+1]);
    22		}
    23	?>
    24			<br><a href="session_buy.htm">追加購入</a>
    25		</dl>
    26	</body>
    27	</html>
    			
    18 行目~ 22 行目

      セッション内のデータをすべて出力している.count配列関数の一つであり,配列の要素数を返す.

    24 行目

      「追加購入」ボタンをクリックすると,session_buy.htm へ移動し,さらに商品を購入したり,または,セッションデータを削除することができる.

情報学部 菅沼ホーム 目次 索引