WebプログラミングU PHP

 目次へ 前へ 次へ

2015/4/1 久米

来週PHP基礎の実技試験します

1.3フォーム投稿

コラム from投稿の仕組

  1. タイプsubmitボタンを押すと、
  2. クライアントPCが、(けっして「サーバAが」ではない!)
  3. formの各値を、
  4. action="url"に書かれたurlのサーバBへ送る。
  5. 結果はそのサーバBから送られる。

※もちろんサーバAとBが同じサーバでもよい。







P
C
--------->

<---------
formページ


submit
----------
actionのurl

<---------
結果



A



---


---







----->


------



B

 

1.3.1フォーム投稿の値をphp側で参照する方法

フォーム部品
 
PHP側で参照する時 渡された値
name="abc" value="100"
POST→
$_POST['abc'] "100"
GET→
$_GET['abc']
どちらでも→ $_REQUEST['abc']

※[ ]の中の['abc']は、["abc"]でもよい

確認例

ファイルform01.htm   ファイルform01.php
bodyの中で
<form method="post" action="form01.php"> <p>メッセージ<input type="text" name="message" value=""></p> <p> <input type="submit" name="sub" value="投稿"> </p> </form>
<?php
$m= $_POST['message'];
$m2= $_POST['sub'];
?>
bodyの中で <?php print "変数messageの値は ".$m."<br />"; print "変数subの値は ".$m2; ?>

1.3.2各フォーム部品

例題 下記それぞれのフォーム部品を受取ってプリントする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="取消">


注1)phpファイルを直接開くのを対処

form投稿を受け取るphpファイル(例form01.php)を直接開くとエラーになる。
これはformで値がなにも飛んでこないのに$_POSTで値を読み込もうとするからです。
これを防ぐには、下記一文を$_POSTを処理する前に入れておく。

if(!isset($_POST['sub'])){//submitボタン属性が設定されていない場合。つまりformの値がない場合。
    exit("Access Error!");//phpファイルを直接開いたので「アクセスエラー」と表示し処理中断。
}

※exitのカッコの中を日本語にすると文字化けする場合がある。
対処方法は後日教えるが、簡単のためここではAccess Error!と英語表記にした。
 

演習1 秘密のページを作ってみよ。
(パスワードを知っている人だけが入れるページ。なおパスワードは1234とせよ。)

演習2 フォームテキスト枠を2つ作り、そこに数字を入力して計算ボタンを押すと、
掛け算の結果が表示されるようにせよ。

演習3 貴方はDALL社のサイト管理者です。
1) PCトラブル相談センターのページをformタグで作成してください。(自由に)
2)送信ボタンを押したら、この内容でいいですか?という確認のためのページを送り返してください。

 

1.3.3POSTとGET

  指定方法 説明 備考
POST method="post" 内部的に渡す 通常はこちらを使用しましょう。
GET method="get" URLに付加して渡す http://URL?データ名1=値1&データ名2=値2&

GETのいい点は、リンクで飛ばすことができること。(演習4)

演習4 下記リンクをクリックしたら、それを受信して商品を説明するスクリプトを記述せよ。
<a href="form04.php?no=1">おいしい北海道産カニ</a>
<a href="form04.php?no=2">ほくほく鹿児島産石焼き芋</a>
<a href="form04.php?no=3">つるつる越前ソバ</a>

 

1.3.4自分自身を呼び出す

自分自身を呼び出す場合、
<form method="post" action="自分のurl">でなく
<form method="post" action="">とaction属性の値を空文字にすればOK。

どちらでページを開いたか? 処理
普通にページを開いた場合 フォーム部品を表示
submitボタンを押して呼び出した場合 フォーム部品で入力された値を処理

例 注1の考えを応用

if(isset($_POST['sub'])){//submitボタン属性が設定されているか?
    //submitボタンを押して呼び出したので 
    //フォーム部品で入力された値の処理
}

 

演習5 下記フォーム部品投稿したら、各変数をprintするような、自分自身を呼び出すphpページを作成せよ。
(レイアウトなどは適当に変えていいです)

<form name="f1" method="post" action="enshu5.php">
名前:<input type="text" name="name"><br>
E-Mail:<input type="text" name="mail"><br>
タイトル:<input type="text" name="title"><br>
本文:<br>
<textarea name="body" ROWS="5" COLS="70"></textarea><br>
URL(http://から記入):<input type="text" name="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
がOffになったいきさつ(php.iniファイル内)

Onの場合は、フォーム変数(例 abc)が、渡されたphpページで直接(例 $abcとして)参照できる。
便利だが、注意深くプログラミングしないとセキュリティ上の危険がある。
そのため、バージョン4.2.0からデフォルトOffになった。

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は書き直さない方がベターでしょう。