2008/5/20 久米
 コラム from投稿の仕組
 ※もちろんサーバAとBが同じサーバでもよい。 
 
  | 
  
| フォーム部品 | 
 | 
    PHP側で参照する時 | 渡された値 | 
| name="abc" value="100" | 
 POST→  | 
    $_POST['abc'] | "100" | 
| 
 GET→  | 
    $_GET['abc'] | ||
| どちらでも→ | $_REQUEST['abc'] | 
※[ ]の中の['abc']は、["abc"]でもよい
確認例
| ファイルform01.htm | ファイルform01.php | |
<form method="post" action="form01.php">
  <p>メッセージ<input type="text" name="message" value=""></p>
  <p>
    <input type="submit" name="sub" value="投稿">
    <input type="reset" name="reset" value="クリア">
  </p>
</form>
 | 
    → | <?php print "変数messageの値は ".$_POST['message']."<br>"; print "変数subの値は ".$_POST['sub']."<br>"; ?>  | 
  
演習1 下記それぞれのフォーム部品を受取ってプリントするform02.phpファイルを作りましょう。
| テキスト枠 | ユーザ名:<input type="text" name="name"><br> | 
| パスワード枠 | パスワード:<input type="password" name="pass"><br> | 
| hiddenフィールド | <input type="hidden" name="hidden_value" value="練習"><br> | 
| ラジオボタン | <input type="radio" name="seibetu" value="男">男の子  <input type="radio" name="seibetu" value="女">女の子  | 
  
| チェックボックス | <input type="checkbox" name="ok" value="可">メールマガジン受信可 | 
| セレクト | 住所:<select name="jusho"> <option value="東京" selected>東京</option> <option value="神奈川">神奈川</option> <option value="埼玉">埼玉</option> </select>  | 
  
| テキストエリア | <textarea name="message" cols="70" rows="5"></textarea><br> | 
| サブミットボタン | <input type="submit" name="sub" value="登録">  <input type="submit" name="sub" value="取消">  | 
  
 form投稿を受け取るphpファイル(例form01.php)を直接開くとエラーになる。
  これはformで値がなにも飛んでこないのに$_POSTで値を読み込もうとするからです。
  これを防ぐには、下記一文を$_POSTを処理する前に入れておく。
if(!isset($_POST['sub'])){//submitボタン属性が設定されていない場合。つまりformの値がない場合。
    exit("アクセスエラーです。");//phpファイルを直接開いたので「アクセスエラー」と表示し処理中断。
} | 
  
演習2 貴方はDALL社のサイト管理者です。
  1) PCトラブル相談センターのページをformタグで作成してください。(自由に)
  2)送信ボタンを押したら、この内容でいいですか?という確認のためのページを送り返してください。
| 指定方法 | 説明 | 備考 | |
| POST | method="post" | 内部的に渡す | 通常はこちらを使用しましょう。 | 
| GET | method="get" | URLに付加して渡す | http://URL?データ名1=値1&データ名2=値2& | 
GETのいい点は、リンクで飛ばすことができること。(演習3、4)
演習3 下記リンクをクリックしたら、それを受信してプリントするスクリプトを記述せよ。
  <a href="form03.php?best1=php&best2=actionscript&best3=javascript">好きなスクリプト</a>
演習4 下記リンクをクリックしたら、それを受信して商品を説明するスクリプトを記述せよ。
  <a href="form04.php?no=1">おいしい北海道産カニ</a>
  <a href="form04.php?no=2">ほくほく鹿児島産石焼き芋</a>
  <a href="form04.php?no=3">つるつる越前ソバ</a>
| どちらでページを開いたか? | 処理 | 
| 普通にページを開いた場合 | フォーム部品を表示 | 
| submitボタンを押して呼び出した場合 | フォーム部品で入力された値を処理 | 
例 注1の考えを応用
if(isset($_POST['sub'])){//submitボタン属性が設定されているか?
    //submitボタンを押して呼び出したので 
    //フォーム部品で入力された値の処理
} | 
  
演習5 下記フォーム部品投稿したら、各変数をprintするような、自分自身を呼び出すphpページを作成せよ。
  (レイアウトなどは適当に変えていいです)
<form action="enshu5.php" method="post"> 名前:<input type="text" name="name" value="" id="name"><br> E-Mail:<input type="text" name="mail" value="" id="mail"><br> タイトル:<input type="text" name="title" value="" id="title"><br> 本文:<br> <textarea name="body" ROWS="5" COLS="70" id="body"></textarea><br> URL(http://から記入):<input type="text" name="url" value="" id="url"><br> <input type="submit" name="sub" value="投稿"> <input type="reset" value="クリア"> </form>  | 
  
参考 得得情報
  action="<?php print htmlspecialchars($_SERVER['PHP_SELF']); ?>"
とすればファイル名は書かなくてよい。
参考の参考 $_SERVER['PHP_SELF']とXSS脆弱性
 コラム デフォルトでregister_globals=On
       | 
  
| http://example.com/foo.phpの中のプログラム if($user_assword === "runrun") $valid = 1; if ($valid === 1) //以下認証成功した時の処理  | 
        
上記例は$valid=0;の初期化をしていない。
        心得のあるプログラマは初期化をするのであるが・・・ 忘れたのかもしれない。
 悪意のある利用者が、なんらかの手段で$valid変数の存在を知った場合、
        上記プログラムの認証は突破できる。
http://example.com/foo.php へのアクセス時に
        ?valid=1 を書き足して
        http://example.com/foo.php?valid=1
        でアクセスすることにより、認証成功と同じ結果を得ることができてしまう。
参照 グローバル変数の登録機能の使用法
        ※よって参考書最速Webシステムのp307のphp.iniは書き直さない方がベターでしょう。