忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/07/21 17:50 |
PHP2-2:投稿フォームを作ろう
とりあえず普通にHTMLでフォームを作ってみる。

index.php
 <form method="POST" action="./validate.php">
     氏名:<input type="text" name="shimei" maxlength="64"><br />
     メアド:<input type="text" name="mail" maxlength="64"><br />
     性別:
     <input type="radio" name="sex" value="1">男 
     <input type="radio" name="sex" value="2">女<br />
     <input type="submit" name="soushin" value=" 確認 ">
</form>

まあよくあるフォームです。actionを指定したのでvalidate.phpを作らなくてはなりません。
何をするかというと入力値のチェックです。

validate.php

      #初期設定
     $error_message_array=array();
    
     #POSTデータの取得
     $shimei=$_POST['shimei'];
     $mail=$_POST['mail'];
     $sex=$_POST['sex'];

     #入力をチェック
     if(empty($shimei)){$error_message_array+="氏名が入力されていません"};
     if(empty($mail)){$error_message_array+="メアドが入力されていません"};
     if($sex!=1 && $sex!=2){$error_message_array+="性別が入力されていません"};

     #エラーの有無で分岐
     if(empty($error_message_array)){
          require("validate_ok.php");
     }else{
          require("validate_error.php");
     }


簡単に流れを書くと以上のようになります。
性別は入る値が1か2に決まっているので、判定も1か2かで行います。
radio、checkbox、hiddenは最初から決められている値以外に変更することはできないように見えますが、実は簡単に行えます。
外部から入ってくるデータは基本的に汚染されているものだと考えてチェックを行う必要があります。

保存部分は簡単に作成します。
保存部分は「,」で区切っているだけなので、入力値に「,」を入れられると困ったことになりますが、今回はまあパスします。
form.txtは予め作成しておかねばなりませんが、これで保存部分ができました。

validate_ok.php

    $data=$shimei.','.$mail.','.$sex;
    $fp = fopen("form.txt","r+");
    flock($fp,LOCK_EX);
    fputs($fp,$data);
    fclose($fp);


さて、入力のエラーがあった場合もとの入力画面に戻されるのはよくある光景ですが、このときにせっかく登録した内容が消えていたりすると非常にがっかりです。
入力した内容を保持しておいて、入力画面に戻ってきた場合には最初から表示されるようにしましょう。

新たに以下のようなエラー画面を用意して、validate.phpに組み込んであげればよいことになります。
内容的には、valueにフォームから送信されてきた値をセットしているだけです。
htmlspecialcharsという不思議な関数ですが、入力値に「"><script>alert("XSS");</script>」と入れてみるとその理由がわかります。

validate_error.php

 <?php print($error_message_array); ?>
<form method="POST" action="./validate.php">
     氏名:<input type="text" name="shimei" maxlength="64" value="<?php print(htmlspecialchars($shimei)); ?>"><br />
     メアド:<input type="text" name="mail" maxlength="64" value="<?php print(htmlspecialchars($mail)); ?>"><br />
     性別:
     <input type="radio" name="sex" value="1"<?php if($sex==1){print(" checked");} ?>>男 
     <input type="radio" name="sex" value="2"<?php if($sex==2){print(" checked");} ?>>女<br />
     <input type="submit" name="soushin" value=" 確認 ">
</form>


しかしindex.phpとほとんど同じ内容なのに、わざわざもう一度作るのも馬鹿みたいです。

多くの言語と違い、PHPはデフォルトの設定では、未定義の変数を呼び出したとき中身が空として扱ってくれます。
従ってvalidate_error.phpをそのままindex.phpにリネームすれば何事もなく動いてくれます。

ただしerror_reporting等で厳しくエラーチェックしているとエラーが発生します。
その場合はまた変数の存在確認などの処理を行ったりしなければなりません。
面倒なので全部纏めてしまいましょう。

index2.php

 <?php
     #初期設定
     $error_message_array="";
    
     if($_POST){
          #POSTがあれば、取得
          $shimei=$_POST['shimei'];
          $mail=$_POST['mail'];
          $sex=$_POST['sex'];
         
          #入力をチェック
          if(empty($shimei)){$error_message_array.="氏名が入力されていません<br />";}
          if(empty($mail)){$error_message_array.="メアドが入力されていません<br />";}
          if($sex!=1 && $sex!=2){$error_message_array.="性別が入力されていません<br />";}
     }else{
          #POSTがなければ
          $error_message_array.="フォームを入力してください<br />";
     }
    
     #エラーの有無で分岐
     if(empty($error_message_array)){
          $data='氏名:'.$shimei.',メアド:'.$mail.'性別:'.$sex;
          $fp = fopen("form.txt","r+");
          flock($fp,LOCK_EX);
          fputs($fp,$data);
          fclose($fp);
          print("投稿を受け付けました。<br />ご協力ありがとうございました");
     }else{
          ?>

          <?php print($error_message_array); ?>
          <form method="POST" action="<?php print(htmlspecialchars($_SERVER['SCRIPT_NAME'])); ?>">
               氏名:<input type="text" name="shimei" maxlength="64" value="<?php print(htmlspecialchars($shimei)); ?>"><br />
               メアド:<input type="text" name="mail" maxlength="64" value="<?php print(htmlspecialchars($mail)); ?>"><br />
               性別:
               <input type="radio" name="sex" value="1"<?php if($sex==1){print(" checked");} ?>>男 
               <input type="radio" name="sex" value="2"<?php if($sex==2){print(" checked");} ?>>女<br />
               <input type="submit" name="soushin" value=" 確認 ">
          </form>

          <?php
     }
?>


フォームのデータを自分自身に送っています。
$_POSTの値が存在すればそれを代入し、存在しなかった場合は空として扱ってくれます。
1ページで投稿フォームを作成することができました。

細かな部分でまだ問題がありますが、ひとまずは以上で完成です。
次回は投稿確認画面でも作りましょうか。

ところでこのブログって横幅どうにかならないんですかね?

PR


2008/05/09 14:57 | Comments(0) | TrackBack(2) | PHP

トラックバック

トラックバックURL:
昔ずいぶん適当な投稿フォームを作りましたが、昨今流行りのクラスを使ってたらりんと書き換えていきましょう。 フォルダ構成はこんなかんじ /Smarty/(Smarty構成ファイル) /form/htdocs/index.php      /lib/index.php      /templates/(テンプレ)      /templates_c/(テンプレのキャ...
弱小PHPerの憂鬱 | 2009/08/10 20:28
前回はpharアーカイブをライブラリとして使用しましたが、実はpharアーカイブだけで完全な動作をするPHPプログラムを作成可能です。 この利用法、Phar::webPhar()あたりをよく読めば書いてあるのですが、物凄く便利っぽい機能にもかかわらず何故か何処にもこれを使ってみたという人が見あたらない不思議。 まあとりあえずでっちあげてみたのがこちら。 http://file.yuubiseiharukana.blog.shinobi.jp/20110730-index.phar.zip...
弱小PHPerの憂鬱 | 2011/07/30 01:45

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<JavaScript1-2:全角半角変換関数 | HOME | PHP2-1:アクセスカウンターを作ろう>>
忍者ブログ[PR]