前回は、PHPの中で作ったデータを表示しました。
今回は、「ユーザーが画面に入力したデータ」をPHPで受け取ってみましょう。
これができると、「名前を入れたら占ってくれるアプリ」や「メッセージを送れる掲示板」などが作れるようになります!
1. データの送り方(HTML側)
まずはデータを送るための「フォーム」を作ります。
ここで一番大事なのは name 属性 です。
<!-- method="post" で送信方法を指定 -->
<form action="result.php" method="post">
<!-- name="my_name" がPHPでの「合言葉」になる! -->
<input type="text" name="my_name">
<button type="submit">送信</button>
</form>
- action: どこへ送るか(送り先のPHPファイル)。
- method: どうやって送るか(後述)。
- name: データの「ラベル」。これがないとPHPは受け取れません!
2. データの受け取り方(PHP側)
PHP側では、送られてきたデータは自動的に $_POST(ポスト)という連想配列に入ります。
// HTMLの name="my_name" で送られたデータを受け取る
$name = $_POST['my_name'];
echo $name . "さん、こんにちは!";
たったこれだけです!
「HTMLのname属性」が、そのまま「PHPの連想配列のキー」になる仕組みです。
3. POSTとGETの違い
method には、主に2種類の送り方があります。
| 送り方 | 特徴 | 使い道 |
|---|---|---|
| POST (ポスト) |
データが見えないように裏で送る。 封筒に入れて送るイメージ。 |
パスワード、個人情報、 長い文章(ブログ投稿など) |
| GET (ゲット) |
URLの後ろにくっつけて送る。 ハガキで送るイメージ。 |
検索キーワード (URLをコピーして共有したい時) |
基本的には、「何かを登録・送信する時はPOSTを使う」と覚えておけばOKです。
4. 【重要】セキュリティの盾「htmlspecialchars」
フォームを作る時、絶対に守らなければならないルールがあります。
それは、「受け取ったデータをそのまま表示してはいけない」ということです。
もし悪意のある人が、名前欄に <script>ウイルスプログラム</script> と入力して送信したらどうなるでしょう?
そのまま表示すると、そのページを見た人全員のブラウザでウイルスが動いてしまいます(XSS攻撃)。
これを防ぐために、表示する時は必ず htmlspecialchars(エイチティーエムエル・スペシャル・チャーズ) という関数を通します。
// 危険なタグを無効化(ただの文字に変換)する
$safe_name = htmlspecialchars($_POST['my_name'], ENT_QUOTES, 'UTF-8');
echo $safe_name;
ちょっと長いですが、これは「PHPのお守り」だと思って、コピペで毎回使ってください。
実践:今日の運勢占いアプリ
では、名前を入力するとランダムで運勢を表示するアプリを作りましょう。
今回は簡単にするため、1つのファイル(fortune.php)で送信と受信の両方を行います。
<?php
// 結果を入れる変数を準備
$result = "";
// もし「POST送信」がされたら、占いをする
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 1. 入力を受け取る(お守りを通す!)
$name = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8');
// 2. 運勢のリスト
$fortunes = ["大吉", "中吉", "小吉", "末吉"];
// 3. ランダムに1つ選ぶ (array_randはキーを返すので注意)
$key = array_rand($fortunes);
$luck = $fortunes[$key];
// 4. 結果の文章を作る
$result = "{$name}さんの今日の運勢は「{$luck}」です!";
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>占いアプリ</title>
</head>
<body>
<h1>今日の運勢を占います</h1>
<!-- 自分自身(fortune.php)に送信する -->
<form action="" method="post">
<input type="text" name="username" placeholder="名前を入れてね">
<button type="submit">占う!</button>
</form>
<!-- 結果があれば表示する -->
<?php if ($result !== ""): ?>
<div style="border: 2px solid orange; padding: 10px; margin-top: 20px;">
<?php echo $result; ?>
</div>
<?php endif; ?>
</body>
</html>
まとめ
- フォーム送信には
name属性 が必須。 - 受け取る時は
$_POST['name']。 - 表示する時は
htmlspecialchars()で無毒化する。
これで「ユーザーからの入力」を扱えるようになりました。
次回は、入力されなかった時の「エラーチェック(バリデーション)」について学びます。
「名前が空です!」と警告を出せるようになりましょう!
📝 今日のミニテスト
PHPの基本動作チェック!
Q1. HTMLのフォームで、送信データに名前をつける属性は?
正解:name 属性
idやclassではありません。<input name="email"> と書くと、PHP側で「email」として受け取れます。
Q2. パスワードなど、見られたくない情報を送る時の method は?
正解:POST
GET はURLに表示されてしまうので、秘密の情報には使いません。
Q3. ユーザーが入力した文字を表示する際、必ず使うべき関数は?
正解:htmlspecialchars()
これを忘れると、JavaScriptを埋め込まれて攻撃される「XSS(クロスサイトスクリプティング)」という脆弱性になります。