ページ作成
ソースリスト
CSS
データの取得
|
HTMLデータの取得HTML の form タグを使ったデータの取得方法を示します. 目次はじめにユーザーからデータを取得することで,webプログラムでの処理の内容が拡がります.ユーザーが入力したデータをwebプログラムが受け取るためには,FORMタグを使う.ここでは,その使い方を簡単にまとめておきます. FORMタグを使ったデータ取得データ入力画面の作成HTMLには,以下に示すようなデータ入力のためのフォームがあります.適当にデータを入れて,実行ボタンをクリックしてみてください. このフォームのHTMLのソースは以下の通りです.実行ボタンをクリックすると,action で指定している act_post.pht が実行されます.POST メソッドで,データは act.php に送られ,そこでデータの処理が行われます.データを受け取り,処理する方法については「データ処理プログラム」で示します. method で "GET"を指定すれば,GETメソッドで送ることもできます.しかし,GETメソッドには文字数の制限があるし,URLの欄にデータが表示されるので望ましくありません.POSTメソッドを使うことを勧めます. <FORM method="POST" enctype="multipart/form-data" action="act_post.php"> <TABLE border="0"> <TBODY> <TR> <TD>テキストエリア</TD> <TD><textarea name="input_txtarea" cols=40 rows=4></textarea></TD> </TR> <TR> <TD>テキスト</TD> <TD><INPUT size="35" type="text" name="input_txt"></TD> </TR> <TR> <TD>パスワード</TD> <TD><INPUT size="35" type="password" name="input_passwd"></TD> </TR> <TR> <TD>ファイル</TD> <input type="hidden" name="MAX_FILE_SIZE" value="2097152"> <TD><INPUT size="35" type="file" name="upload_file"></TD> </TR> <TR> <TD>セレクト</TD> <TD><select name="month"> <option value="Jan">January <option value="Feb">February <option value="Mar">March <option value="Apr">April </select></TD> </TR> <TR> <TD>チェックボックス</TD> <TD><INPUT type="checkbox" name="check[]" value="one">one <INPUT type="checkbox" name="check[]" value="two">two <INPUT type="checkbox" name="check[]" value="three">three <INPUT type="checkbox" name="check[]" value="four">four</TD> </TR> <TR> <TD>ラジオボタン</TD> <TD><INPUT type="radio" name="button" value="eins" checked>eins <INPUT type="radio" name="button" value="zwei">zwei <INPUT type="radio" name="button" value="deri">drei</TD> </TR> <TR> <TD></TD> <TD><input type="submit" value="実行"> <input type="reset" value="リセット"></TD> </TR> </TBODY> </TABLE> </FORM> データ処理プログラム先に示したデータの入力画面の実行ボタンをクリックすると,FORMタグの action で指定した act_post.php が実行されます.適当なデータを入れて,実行ボタンをクリックしてください.様子が分かると思います. この実行されるプログラムを書くためには,データの取得方法を理解しなくてはなりません.こでは,PHPでデータを取得して処理する基本を述べます. 連想配列$_POST[]で取得できるデータPOSTメソッドで渡されたデータは,グローバルな連想配列$_POST[]に格納されています.先ほどの例だと,次のようになっています.
このようにデータがひとつしかない場合,データは連想配列$_POST[]に格納されるので,その取得は容易です.それに対して,チェックボックスとファイルは特殊な扱いが必要です. チェックボックスのデータ配列を使う方法チェックボックスのデータの数は不定です.ゼロ個の場合もあるし,複数の場合もあります.このことがチェックボックスの処理を複雑にします.ひとつもチェックされていない場合も考えて処理を行わなくてはなりません.そのため,最初にデータの有無をチェックします.通常は,次のように isset()関数を使えば良いでしょう. if(isset($_POST[check])){ チェックがある場合の処理 }else{ 全くチェックがない場合の処理 } isset()関数は,変数の有無を確認します.変数があれば TRUE,変数がない場合には FALSE を返します.チェックボックスの変数は,連想配列 $_POST[]に格納されます.連想配列のインデックスはチェックボックスの name で指定した変数名—ここでは配列名check —にします. 全くチェックがなかった場合,適当に処理をすれば良いでしょう.チェックがある場合にはひとつずつ呼び出してどれがチェックされたか調べる必要があります.通常は次のようにします. foreach($_POST[check] as $val){ 変数 $val の値を処理する. } このようにすると,変数 $val はチェックされたチェックボックスの value の値—ここではone, two, three, four —になります. 実際,チェックボックスの value の値は$_POST[check][0], $_POST[check][1],…に格納されるので,次のように書いても同じことができます. for($i=0; $i<count($_POST[check]); $i++){ $_POST[check][$i] の値を処理する. } 関数 count()で配列の要素数を調べて,繰り返し文で処理しています. 配列を使わない方法さらに単純な方法として,次のように書くこともできます. <FORM method="POST" action="simple_ck.php"> <TABLE border="0"> <TBODY> <TR> <TD>チェックボックス</TD> <TD><INPUT type="checkbox" name="ck_one" value="one">one <INPUT type="checkbox" name="ck_two" value="two">two <INPUT type="checkbox" name="ck_three" value="three">three <INPUT type="checkbox" name="ck_four" value="four">four</TD> </TR> <TR> <TD></TD> <TD><input type="submit" value="実行"> <input type="reset" value="リセット"></TD> </TR> </TABLE> </FORM> すると,以下のようなチェックボックスができます.適当にチェックをして実行ボタンをクリックすると,データの処理する方法が分かります. ファイルのアップロードファイルのアップロードの機能を使う場合,ファイルサイズの最大バイト数を考慮しなくてはなりません.これは,php.ini の upload_max_filesize で決められています.デフォルトは2Mバイトで,phpinfo()関数で見ることができます. 先に示した「データ入力画面の作成」で適当なファイルを指定し,実行ボタンをクリックするとファイルのアップロードができます.そして,以下のような変数の値がセットされます.これらの変数の値の呼出し方は,実行ボタンをクリックした画面で説明しています.
アップロードしたファイルは,phpで決まっているテンポラリディレクトリーに適当なファイル名で格納されます.そのため,ユーザーがファイルを処理するときには,ディレクトリーの移動とファイル名の変更が必要です. 次に示すPHPのプログラムで,ファイルアップロードの処理ができます.ファイルの拡張子を検査しそれが php や cgi のとき,.changed を付加しています.このようにすることで,悪意のあるファイルがアップロードされて,それが実行されることを防いでいます.その後,テンポラリーなファイルを意図したディレクトリーに移動させます.このプログラムが実行される前に,テンポラリーなディレクトリーへのアップロードが完了しているので,このような操作が可能です. <?php if(is_uploaded_file($_FILES["upload_file"]["tmp_name"])){ $uploaddir = "/home/yamamoto/www/comp/WEB/get_data/upload_files/"; $p = strrpos($_FILES["upload_file"]["name"],"."); $e = substr($_FILES["upload_file"]["name"],$p+1, strlen($_FILES["upload_file"]["name"])-$p); $e = strtolower($e); if($e=="php" || $e =="cgi"){ $uploadfile = $uploaddir.$_FILES["upload_file"]["name"].".changed"; print "拡張子を変更しました..changed を付加しました.<BR>\n"; }else{ $uploadfile = $uploaddir.$_FILES["upload_file"]["name"]; } if(move_uploaded_file($_FILES["upload_file"]["tmp_name"], $uploadfile)){ print "ファイルのアップロード処理は成功しました.<BR>\n"; }else{ print "ファイルのアップロード処理に失敗しました.<BR>\n"; } }else{ print "ファイルのアップロードに失敗しました.<BR>\n"; print " エラーコード --> ".$_FILES["upload_file"]["error"]."<BR>\n"; } ?> |