htmlでフォームを作ってPHPに渡す
ユーザからのデータを受け取るために、index.htmlにフォームを設置します。
フォームはボックスの中に文字列を入れて送信ボタンを押すと実行できるようなものです。
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title>フォームページ</title>
</head>
<body>
<form action="explain.php" method="get">
<input type="text" name="message"><br>
<input type="submit" value="送信">
</form>
</body>
</html>
コードで重要な部分は<body>タグの中の3行だけです。
https://example.com/index.htmlにアクセスすると上の画像のフォームが現れます。
example.comの部分は別途自分で設定が必要です。
フォームについては以下のページで詳しく説明されています
https://developer.mozilla.org/ja/docs/Learn/Forms/Sending_and_retrieving_form_data
form action=”explain.php” method=”get”でGETのメソッドでexplain.phpを実行する
action=”ここにはデータの送信先を指定します”
・絶対URLで指定
action="https://example.com/explain.php"
・相対URLで指定
action="explain.php"
・無指定
action="" → このファイル自身に送信
method属性ではGETかPOSTで送信するかを指定できます。
GETで送信するにはmethod=”get”で指定します。
method="get"
method="post"
input type=”text” name=”message” value=”送信”
input typeではフォームのタイプを選択できます。
input type=”text”にすると文字列記述タイプのフォームが設置されます。
詳しくは以下のURLが参考になります。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/input#input_の型
input type="text" name="message"
→massageというキーでフォームに入力した値が入る
submitはフォームを送信するボタンを表示するものです。valueにはボタンに表示される名前です。
<input type="submit" value="送信">
submitについて:https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/submit
GETでのデータのやり取りを確認する
実際に作成したフォームに「test」と入力して送信し、サーバ側のアクセスログを見てみます。
"GET /explain.php?message=test HTTP/1.1" 200 35 "https://example.com/"
?以降のクエリストリングにmessage=testの値がサーバに送信されているのがわかります。
上の例ではデータの送信先はaction=”explain.php”です。
explain.phpを作成して、GETの中身を表示するようにプログラムを書いてみます。
# cat explain.php
<?php
echo $_GET['message'];
?>
$_GETはGETで受け取ったデータを表していて、形式は連想配列です。
$_GETについて:https://www.php.net/manual/ja/reserved.variables.get.php
連想配列とは{キー:値}という形式のデータです。
GETでは ?message=test という値が渡されてるので
echo $_GET['message'];
$_GET中のmessageキーを指定して"test"という値を取り出す
流れは以下のようになります。
- https://example.com/index.htmlにアクセス
- index.htmlのフォームでmessage=testのデータをGETメソッドでexplain.phpに送付
- explain.phpは$_GETに入ったデータのうちmessageを指定してtestの文字列を表示
- https://example.com/explain.php?message=testのURLで”test”とブラウザに表示される。
index.htmlを作成せずにfrom.phpだけで完結させる
フォームはhtml
処理はPHP
のように役割を分けていましたが、PHPとHTMLは一緒に書けるのでphpファイル一つだけでこなすこともできます。
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title>フォームページ</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="message"><br>
<input type="submit" value="送信">
</form>
</body>
</html>
<!-- 上はHTML、下はPHP -->
<?php
echo $_GET['message'];
?>
from.phpの上部にはHTML、下にはPHPを書いています。
from action=””はGETの値を自分自身で受け取るので何も入力していません(form.phpと書いても良い)
https://example.com/form.phpにアクセスしてtestとフォームに入力してアクセスログを見てみると以下のように自分自身にGET /form.php?message=testを送信しています。
"GET /form.php HTTP/1.1" 200 248 "-"
"GET /form.php?message=test HTTP/1.1" 200 250 "-"
一緒に書いてしまっているので、フォームが見ていますがPHPで書いたmessageの値 testがきちんと表示されています。
POSTでデータを受け取る
POSTでデータを受け取るにはmethodでpostを指定します。
method="post"
データを受け取るphpプログラムにも修正が必要です。
$_GETから$_POSTに変更します。
<?php
echo $_POST['message'];
?>
フォームを送信するときちんとtestと表示されます。
ログを確認してみましょう
"GET /form.php HTTP/1.1" 200 278 "-"
↓フォームに test と入力して送信
"POST /form.php HTTP/1.1" 200 284 "https://example.com/form.php"
POSTはURLでデータを送信しないのでURLには変化がありません。
フォーム送信後はPOSTに変わっています。
POSTとGETは何が違う?
クエリストリングを使えばGETでもデータをサーバに送信することができますが、URLに直接載せるという性質上以下の制約があります。
- 意図しないで入力内容が漏洩する可能性(セキュリティリスク)
- URL長の制限(大容量データは送信できない)
例えばブラウザのヒストリをみるとGETで入力した内容が残っていて、他人がヒストリを見れば入力内容がわかってしまうなどのリスクがあったりします。
特に理由がなければPOSTを利用するのが良さそうです。