静岡理工科大学 菅沼ホーム PHP 目次 索引

フォームと PHP

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

  1. フォームと PHP

    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		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
      07	</HEAD>
      08	<BODY CLASS="white">
      09		<H1 STYLE="text-align: center">フォームと PHP</H1>
      10		<HR>
      11		<P STYLE="text-align: center">フォームデータ</P>
      12		<FORM NAME="form1" ACTION="test1.php" METHOD="post">
      13			<P STYLE="text-align: center">
      14				名前: <INPUT TYPE="text" NAME="name" STYLE="font-size: 90%">  
      15				性別: <INPUT TYPE="radio" NAME="sex" VALUE="Male"> 男性 
      16				<INPUT TYPE="radio" NAME="sex" VALUE="Female"> 女性<BR>
      17				メッセージ: <TEXTAREA NAME="message" ROWS="2" COLS="30" STYLE="font-size: 90%"></TEXTAREA><BR>
      18				<INPUT TYPE="submit" VALUE="送信" STYLE="font-size: 90%"> <INPUT TYPE="reset" STYLE="font-size: 90%">
      19			</P>
      20		</FORM>
      21		<HR>
      22		<P STYLE="text-align: center">ファイルのアップロード</P>
      23		<FORM NAME="form2" ENCTYPE="multipart/form-data" ACTION="test2.php" METHOD="post">
      24			<P STYLE="text-align: center">
      25				<INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="10000000" >
      26				<INPUT TYPE="file" NAME="file_name" STYLE="font-size: 90%">
      27				<INPUT TYPE="submit" VALUE="アップロード" STYLE="font-size: 90%">
      28			</P>
      29		</FORM>
      30	</BODY>
      31	</HTML>
      				
      12 行目~ 20 行目

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

      23 行目~ 29 行目

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

      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		<LINK REL="stylesheet" TYPE="text/css" HREF="../../master.css">
      07	</HEAD>
      08	<BODY CLASS="white">
      09		<H1 STYLE="text-align: center">フォームデータ</H1>
      10		<DL>
      11			<DD>$_POST['name']: <?php echo $_POST['name'] ?>
      12			<DD>$_POST['sex']: <?php echo $_POST['sex'] ?>
      13			<DD>$_POST['message']: <?php echo $_POST['message'] ?>
      14		</DL>
      15	</BODY>
      16	</HTML>
      				
      11 行目~ 13 行目

        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		<LINK REL="stylesheet" TYPE="text/css" HREF="../../master.css">
      07	</HEAD>
      08	<BODY CLASS="white">
      09		<H1 STYLE="text-align: center">アップロード結果</H1>
      10		<DL>
      11		<?php
      12			$uploadfile  = "./".$_FILES['file_name']['name'];
      13			if (move_uploaded_file($_FILES['file_name']['tmp_name'], $uploadfile)) {
      14		?>
      15				<DD>$_FILES['file_name']['name']: <?php echo $_FILES['file_name']['name'] ?>
      16				<DD>$_FILES['file_name']['type']: <?php echo $_FILES['file_name']['type'] ?>
      17				<DD>$_FILES['file_name']['tmp_name']: <?php echo $_FILES['file_name']['tmp_name'] ?>
      18				<DD>$_FILES['file_name']['error']: <?php echo $_FILES['file_name']['error'] ?>
      19				<DD>$_FILES['file_name']['size']: <?php echo $_FILES['file_name']['size'] ?>
      20				<DT>ファイル <?php echo $_FILES['file_name']['name'] ?> をアップロードしました.
      21		<?php
      22			}
      23		?>
      24		</DL>
      25	</BODY>
      26	</HTML>
      				
      12 行目

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

      15 行目~ 20 行目

        アップロードに関する情報は,定義済み変数の一つである $_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">
      </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		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
      07		<SCRIPT TYPE="text/javascript">
      08			function check(form) {
      09				if(form.ans.value =="") {
      10					alert("答えを入力してください");   // ダイアログの表示
      11					return false;
      12				}
      13				if(form.name.value =="") {
      14					alert("名前を入力してください");   // ダイアログの表示
      15					return false;
      16				}
      17			}
      18		</SCRIPT>
      19	</HEAD>
      20	<BODY CLASS="white">
      21		<H3 STYLE="text-align:center">次の問題の答えは?</H3>
      22		<FORM ACTION="check1.php" METHOD="post">
      23			<P STYLE="text-align:center">
      24				3 + 4 = <INPUT TYPE="text" NAME="ans" STYLE="font-size:90%"><BR><BR>
      25				名前:<INPUT TYPE="text" NAME="name" STYLE="font-size:90%">  
      26				<INPUT TYPE="submit" VALUE="送信" onClick="return check(this.form)" STYLE="font-size:90%"><BR>
      27				<INPUT TYPE="hidden" NAME="a" VALUE="3">
      28				<INPUT TYPE="hidden" NAME="b" VALUE="4">
      29			</P>
      30		</FORM>
      31	</BODY>
      32	</HTML>
      				
      09 行目~ 12 行目

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

      13 行目~ 16 行目

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

      26 行目

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

        このとき,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		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
      07	</HEAD>
      08	<BODY CLASS="white">
      09		<?php
      10			if ($_POST['a']+$_POST['b'] == $_POST['ans']) {
      11				printf("<H3 STYLE=\"text-align:center\">%s さん,正解です!</H3>\n", $_POST['name']);
      12				printf("		<H3 STYLE=\"text-align:center\">続いて,次の問題の答えは?</H3>\n");
      13				srand();
      14				$a = floor(rand() / getrandmax() * 100);
      15				$b = floor(rand() / getrandmax() * 100);
      16			}
      17			else {
      18				printf("<H3 STYLE=\"text-align:center\">%s さん,間違っています!</H3>\n", $_POST['name']);
      19				printf("		<H3 STYLE=\"text-align:center\">もう一度計算してみて下さい</H3>\n");
      20				$a = $_POST['a'];
      21				$b = $_POST['b'];
      22			}
      23		?>
      24		<FORM ACTION="check1.php" METHOD="post">
      25			<P STYLE="text-align:center">
      26				<?php echo $a." + ".$b ?> = <INPUT TYPE="text" NAME="ans" STYLE="font-size:90%"><BR><BR>
      27				名前:<INPUT TYPE="text" NAME="name" STYLE="font-size:90%">  
      28				<INPUT TYPE="submit" VALUE="送信" STYLE="font-size:90%"><BR>
      29				<INPUT TYPE="hidden" NAME="a" VALUE="<?php echo $a ?>">
      30				<INPUT TYPE="hidden" NAME="b" VALUE="<?php echo $b ?>">
      31			</P>
      32		</FORM>
      33	</BODY>
      34	</HTML>
      				
      10 行目~ 16 行目

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

      17 行目~ 22 行目

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

      26 行目~ 30 行目

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

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

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

      19 行目~ 65 行目

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

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

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

    5. ユーザの認証

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

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

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

      14 行目~ 18 行目

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

      19 行目

        ファイル user_list を閉じる.

      22 行目

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

      23 行目

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

      24 行目~ 25 行目

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

      26 行目

        ファイル user_list を閉じる.

      29 行目~ 32 行目

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

        これで準備ができましたので,実際にユーザ認証を行ってみましょう.以下に示すのはユーザ 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">
      	<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		<LINK REL="stylesheet" TYPE="text/css" HREF="../../../master.css">
      07	</HEAD>
      08	<BODY CLASS="white">
      09	
      10	<?php
      11		$sw = 0;
      12		$in = fopen("user_list", "rb");
      13		while (fscanf($in, "%s %s", $user, $pass)) {
      14			if ($user == $_POST['user']) {
      15				if (crypt($_POST['password'], $pass) == $pass) {
      16					$sw = 1;
      17					break;
      18				}
      19			}
      20		}
      21		fclose($in);
      22	
      23		if ($sw > 0)
      24			printf("		<H2 STYLE=\"text-align: center\">ユーザ %s を認識しました</H2>\n", $_POST['user']);
      25		else
      26			printf("		<H2 STYLE=\"color: red; text-align: center\">正しいユーザ名とパスワードを入力してください</H2>\n");
      27	?>
      28	
      29	</BODY>
      30	</HTML>
      				
      13 行目~ 20 行目

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

    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		<link rel="stylesheet" type="text/css" href="../../../master.css">
      07	</head>
      08	<body class="white">
      09		<h1 class="center">商品の購入</h1>
      10		<form action="session_buy.php" method="post">
      11			<p class="center">
      12				商品名:<input type="text" name="article" style="font-size: 90%"> 
      13				タイプ:<input type="text" name="type" style="font-size: 90%"> 
      14				<input type="submit" value="購入" style="font-size: 90%">
      15			</p>
      16		</form>
      17		<form action="session_del.php" method="post">
      18			<p class="center">
      19				<input type="submit" value="データ破棄" style="font-size: 90%">
      20			</p>
      21		</form>
      22	</body>
      23	</html>
      				
      12 行目~ 14 行目

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

      19 行目

        「データ破棄」ボタンをクリックすると, 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		<link rel="stylesheet" type="text/css" href="../../../master.css">
      10	</head>
      11	<body class="white">
      12		<h1 class="center">データの破棄</h1>
      13		<dl>
      14	<?php
      15		unset($_SESSION['ss']);
      16		printf("		<dt>すべてのデータを破棄しました\n");
      17	?>
      18		</dl>
      19	</body>
      20	</html>
      				
      02 行目

        セッションを初期化

      15 行目

        変数 $_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		<link rel="stylesheet" type="text/css" href="../../../master.css">
      10	</head>
      11	<body class="white">
      12		<h1 class="center">商品の購入手続き</h1>
      13		<dl>
      14	<?php
      15		if (!isset($_SESSION['ss'])) {
      16			$k = 0;
      17			$_SESSION['ss'][0] = $_POST['article'];
      18			$_SESSION['ss'][1] = $_POST['type'];
      19		}
      20		else {
      21			$k = count($_SESSION['ss']);
      22			$_SESSION['ss'][$k]   = $_POST['article'];
      23			$_SESSION['ss'][$k+1] = $_POST['type'];
      24		}
      25		printf("		<dt>次の商品の購入手続きを行いました\n");
      26		printf("		<p>\n");
      27		printf("		<dd>商品名:%s, タイプ:%s ", $_SESSION['ss'][$k], $_SESSION['ss'][$k+1]);
      28	?>
      29			<a href="session_check.php">確認</a>
      30		</dl>
      31	</body>
      32	</html>
      				
      15 行目~ 19 行目

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

      20 行目~ 24 行目

        変数 $_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		<link rel="stylesheet" type="text/css" href="../../../master.css">
      10	</head>
      11	<body class="white">
      12		<h1 class="center">購入商品の確認</h1>
      13		<dl>
      14	<?php
      15		printf("		<dt>次の商品を購入しています\n");
      16		printf("		<p>\n");
      17		$n = count($_SESSION['ss']) / 2;
      18		for ($i1 = 0; $i1 < $n; $i1++) {
      19			$k = 2 * $i1;
      20			printf("		<dd>%d. 商品名:%s, タイプ:%s<br>\n", $i1+1, $_SESSION['ss'][$k], $_SESSION['ss'][$k+1]);
      21		}
      22	?>
      23			<br><a href="session_buy.htm">追加購入</a>
      24		</dl>
      25	</body>
      26	</html>
      				
      17 行目~ 21 行目

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

      23 行目

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

  2. Java,ActionScript と PHP

      JavaActionScript からも,PHP を CGI として使用可能です.以下に示すいずれの例においても,CGI プログラム test.php は,
    <?php
    	print_r($_POST);
    ?>
    			
    のように,送られてきたデータをそのまま返すだけです.この結果は,送信したページの下にあるテキストエリアに表示されます.

      まず,Java の場合に対するソースプログラムは以下のようになります.
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.net.*;
    import java.io.*;
    
    public class Test extends JApplet implements Runnable, ActionListener
    {
    	URL url;
    	Thread th;
    	JTextField tx1, tx2;
    	JTextArea ta;
    	boolean state = true;
    	boolean submit_sw = false;
    	JButton soshin;
    
    	public void init() {
    					// CGIの設定
    		String name = "test.php";
    		try {
    			url = new URL(getCodeBase(), name);
    		}
    		catch (MalformedURLException e)
    		{
    			System.out.println("Bad URL: " + name);
    		}
    					// コンテントペインとフォント
    		Container cp = getContentPane();
    		cp.setLayout(new FlowLayout(FlowLayout.CENTER));
    		Font f = new Font("TimesRoman", Font.BOLD, 20);
    					// ラベル
    		JLabel lb1 = new JLabel("          次の問題の答は?          ");
    		lb1.setFont(f);
    		cp.add(lb1);
    					// ラベルとテキストフィールド
    		JLabel lb2 = new JLabel("3 + 4 = ");
    		lb2.setFont(f);
    		cp.add(lb2);
    
    		tx1 = new JTextField("", 13);
    		tx1.setFont(f);
    		cp.add(tx1);
    					// ラベル,テキストフィールド,ボタン
    		JLabel lb3 = new JLabel("名前:");
    		lb3.setFont(f);
    		cp.add(lb3);
    
    		tx2 = new JTextField("", 10);
    		tx2.setFont(f);
    		cp.add(tx2);
    
    		soshin = new JButton("送信");
    		soshin.setFont(f);
    		cp.add(soshin);
    		soshin.addActionListener(this);
    					// テキストエリア
    		ta = new JTextArea(4, 20);
    		ta.setFont(f);
    		JScrollPane sp = new JScrollPane(ta);
    		cp.add(sp);
    					// ボタンの追加
    	}
    					// 周囲の余白
    	public Insets getInsets()
    	{
    		return new Insets(10, 10, 10, 10);
    	}
    					// スレッドのスタート
    	public void start()
    	{
    		if (th == null) {
    			th = new Thread(this);
    			th.start();
    		}
    	}
    					// スレッドの停止
    	public void stop()
    	{
    		state = false;
    	}
    					// ボタンが押されたときの処理
    	public void actionPerformed(ActionEvent e)
    	{
    		if (e.getSource() == soshin)
    			submit_sw = true;
    	}
    
    	public void run()
    	{
    		URLConnection c_URL;
    		OutputStream o_stm = null;
    		PrintStream out = null;
    		InputStream i_stm = null;
    		BufferedReader in = null;
    		String line;
    		StringBuffer buf = new StringBuffer();
    
    		while (state) {
    
    			try {
    				Thread.currentThread().sleep(100);	// 100msスリープ
    			}
    			catch (InterruptedException e) {};
    
    			if (submit_sw) {
    				try {
    								// CGIへ接続
    					c_URL = url.openConnection();
    					c_URL.setDoInput(true);
    					c_URL.setDoOutput(true);
    					c_URL.setUseCaches(false);
    					c_URL.connect();
    								// データをCGIへ送信
    					o_stm = c_URL.getOutputStream();
    					out   = new PrintStream(o_stm);
    									// CGIへ送られるデータの設定
    					line  = "data=" + tx1.getText() + "," + tx2.getText();
    					out.print(line);
    					out.close();
    								// CGIからのメッセージを受け取る
    					i_stm = c_URL.getInputStream();
    					in    = new BufferedReader(new InputStreamReader(i_stm));
    					while ((line = in.readLine()) != null)
    						buf.append(line + "\n");
    								// メッセージをテキストエリアに出力
    					ta.setText(buf.toString());
    					in.close();
    
    					state = false;
    					submit_sw = false;
    				}
    
    				catch (UnknownServiceException e) {
    					ta.setText("Unknown Service: " + e.getMessage());
    				}
    				catch (IOException e) {
    					ta.setText("IO Error: " + e.getMessage());
    				}
    			}
    		}
    	}
    }
    			
      次に,ActionScript の場合は,次のようになります.
    package
    {
    	import flash.display.Sprite;
    	import flash.text.TextField;
    	import flash.text.TextFieldType;
    	import flash.text.TextFormat;
    	import flash.net.URLLoader;
    	import flash.net.URLRequest;
    	import flash.net.URLVariables;
    	import flash.net.URLRequestMethod;
    	import flash.events.Event;
    	import flash.events.MouseEvent;
    	import flash.filters.DropShadowFilter;
    
    	[SWF(backgroundColor="0xe1ffe1", width="400", height="250", frameRate="30")]
    
    	public class Test extends Sprite
    	{
    		private var c : TextField;
    		private var na : TextField;
    		private var msg : TextField;
    		private var ld : URLLoader;
    
    		public function Test()
    		{
    			init();
    		}
    		
    		private function init():void
    		{
    			var tf : TextFormat = new TextFormat();
    			tf.size = 20;
    			tf.bold = true;
    
    			var q_t : TextField = new TextField();
    			q_t.text = "次の問題の答えは?";
    			q_t.width = 190;
    			q_t.height = 25;
    			q_t.x = 105;
    			q_t.y = 10;
    			q_t.type = TextFieldType.DYNAMIC;
    			q_t.setTextFormat(tf);
    			addChild(q_t);
    
    			var q : TextField = new TextField();
    			q.text = "3  +  4  =  ";
    			q.width = 100;
    			q.height = 25;
    			q.x = 50;
    			q.y = 45;
    			q.type = TextFieldType.DYNAMIC;
    			q.setTextFormat(tf);
    			addChild(q);
    
    			c = new TextField();
    			c.width = 200;
    			c.height = 25;
    			c.background = true;
    			c.backgroundColor = 0xffffffff;
    			c.x = 170;
    			c.y = 45;
    			c.type = TextFieldType.INPUT;
    			c.defaultTextFormat = tf;
    			c.filters = [new DropShadowFilter(4, 45, 0xaaaaaa, 1, 2, 2, 1, 1, true)];
    			addChild(c);
    
    			var na_t : TextField = new TextField();
    			na_t.text = "名前:";
    			na_t.width = 70;
    			na_t.height = 25;
    			na_t.x = 20;
    			na_t.y = 84;
    			na_t.type = TextFieldType.DYNAMIC;
    			na_t.setTextFormat(tf);
    			addChild(na_t);
    
    			na = new TextField();
    			na.width = 150;
    			na.height = 25;
    			na.background = true;
    			na.backgroundColor = 0xffffffff;
    			na.x = 110;
    			na.y = 84;
    			na.type = TextFieldType.INPUT;
    			na.defaultTextFormat = tf;
    			na.filters = [new DropShadowFilter(4, 45, 0xaaaaaa, 1, 2, 2, 1, 1, true)];
    			addChild(na);
    
    			var trans : sButton = new sButton("送信", 20);
    			trans.x = 300;
    			trans.y = 80;
    			addChild(trans);
    
    			msg  = new TextField();
    			msg.width = 380;
    			msg.height = 120;
    			msg.background = true;
    			msg.backgroundColor = 0xffffffff;
    			msg.x = 10;
    			msg.y = 120;
    			msg.type = TextFieldType.INPUT;
    			msg.multiline = true;
    			msg.defaultTextFormat = tf;
    			msg.filters = [new DropShadowFilter(4, 45, 0xaaaaaa, 1, 2, 2, 1, 1, true)];
    			addChild(msg);
    
    			ld = new URLLoader();
    			ld.addEventListener(Event.COMPLETE, onComplete);
    			trans.addEventListener(MouseEvent.CLICK, onClick);
    		}
    
    		private function onClick(event:MouseEvent):void {
    			var uv : URLVariables = new URLVariables();
    			uv.c = c.text;   // CGIへ送られるデータ
    			uv.na = na.text;   // CGIへ送られるデータ
    			var rq : URLRequest = new URLRequest("test.php");
    			rq.method = URLRequestMethod.POST;
    			rq.data = uv;
    			ld.load(rq);
    		}
    
    		private function onComplete(event:Event):void {
    			msg.text = event.target.data;
    		}
    	}
    }
    			

静岡理工科大学 菅沼ホーム PHP 目次 索引