📁 作成ファイル・保存場所
XAMPPがインストールされているhtdocs フォルダに以下のファイルを作成してください。
| ファイル名 | 内容 |
|---|---|
| htdocs/php-basic/09send.php htdocs/php-basic/09receive.php | PHPとHTML |
- XAMPP(Apacheが起動していること)
- XAMPPがインストールされているhtdocs フォルダに内に作成されていること
今回のテーマ
フォームから送信されたデータを受け取り、表示する方法を学ぼう!
目的
- フォーム(
<form>)の仕組みを理解する $_POST(または$_GET)でデータを受け取れるようになるhtmlspecialchars()を使って安全に表示できるようにする
チェックポイント
method="post"を使って値を送信できる?$_POST['name']のようにデータを受け取れる?htmlspecialchars()でXSS(クロスサイトスクリプティング)対策ができる?
フォームからのデータ受け取り
フォームとは?
ユーザーが入力したデータをサーバーに送るための仕組み。<form> タグを使います。スーパーグローバル変数を使います。
$_GETとは?
$_GET は、フォームやリンクの URLパラメータから送られたデータを取得します。
例)URLが example.php?name=Taro のとき
$name = $_GET['name']; // Taroが取得される
- データがURLに表示される(検索ワードやページ指定に便利)
- リンクからデータを渡すときにも使える
- HTMLでは
<form method="get">を使うとフォーム送信に使える
$_POSTとは?
$_POST は、フォームから「POSTメソッド」で送信されたデータを受け取る連想配列です
$name = $_POST['name']; //これは、<input name="name"> に入力された値を取得する、という意味です。
URLにデータが表示されない(安全性が高い)。大きなデータの送信に向いている(例:アンケート、ログインフォーム)HTMLでは <form method="post"> を使う
$_REQUESTとは?
$_REQUEST は、POST・GETの両方をまとめて受け取れるスーパーグローバル変数です。
$name = $_REQUEST['name'];
$_POSTと$_GETの中身を自動的に探してくれる- 便利だが「どこから送られたデータか分かりにくくなる」こともあるため、
- 基本はPOSTとGETを使い分けるのがベスト
セキュリティ補足
どの変数でも、表示時には必ず htmlspecialchars() を使って XSS対策 を行いましょう!
$name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');

PHP基礎トレーニング
php-basic10send.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>検索フォーム(GET)</title>
</head>
<body>
<h1>商品検索フォーム</h1>
<form action="php-basic08receive.php" method="get">
<p>
<label>キーワード:<input type="text" name="keyword"></label>
</p>
<button type="submit">検索する</button>
</form>
</body>
</html>
php-basic10receive.php
<?php
$keyword = ''; // 初期値を空にしておく
if (isset($_GET['keyword'])) {
//htmlspecialchars() でサニタイズする
$keyword = htmlspecialchars($_GET['keyword'], ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>検索結果</title>
</head>
<body>
<h1>検索結果(GET)</h1>
<?php if (!empty($keyword)): ?>
<p>
<strong>「<?php echo $keyword; ?>」</strong> に関する検索結果を表示中...
</p>
<p>
→ <a href="https://www.google.com/search?q=<?php echo urlencode($keyword); ?>" target="_blank">
Googleで「<?php echo htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8'); ?>」を検索する
</a>
</p>
<?php else: ?>
<p>キーワードが入力されていません。</p>
<?php endif; ?>
<p><a href="php-basic08send.php">戻る</a></p>
</body>
</html>
isset($_GET[‘keyword’]) とは?(イセット)
この記述は、フォームから送られたデータが「存在するかどうか」を確認する処理です。
if (isset($_GET['keyword'])) {
// キーワードが送られてきたときの処理
}
$_GET['keyword'] が存在していれば true 存在しない(未入力・直接アクセスなど)の場合は false フォームから値が送られてこなかった場合、いきなり $_GET['keyword'] を使おうとするとエラーになる可能性があります。安全のために、必ず isset() で「値があるかどうか」を確認してから使うのがPHPの基本です。
htmlspecialcharsでサニタイズとは?
htmlspecialchars() 関数は、HTMLの特殊文字を無害な文字に変換するPHPの関数です。
ユーザーがフォームに入力した内容に < や > などのタグが含まれていた場合、
そのまま echo で表示すると HTMLやJavaScriptとして実行されてしまう可能性があります(=XSS攻撃の危険)。
<script>alert('危険!');</script>
これをそのまま表示すると、JavaScriptが実行されてしまいます。
でも、次のように htmlspecialchars() を使えば
echo htmlspecialchars('<script>alert("危険!");</script>', ENT_QUOTES, 'UTF-8');
<script>alert("危険!");</script>
となり、ただの文字列として安全に表示されます。このように、不正なコードを無害化する処理を「サニタイズ(sanitize)」と呼びます。PHPでは、画面表示の前に htmlspecialchars() を使うことが基本ルールです。
<?php if (!empty($keyword)): ?> とは?
この条件分岐は、$keyword が空でないとき(=何か入力されているとき)に、処理を実行するための書き方です。empty() は、変数が空であるかを調べる関数です。空文字("")、0、null、false、空の配列などを「空」とみなします。
!empty(...) で「空でなければ」
!は「否定」を表します。- つまり
!empty($keyword)は「空でない」という意味になります。
PHP応用トレーニング
php-basic1010send.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>POST送信フォーム(応用編)</title>
</head>
<body>
<h1>お問い合わせフォーム</h1>
<form action="php-basic0808receive.php" method="post">
<p>
<label>名前:
<input type="text" name="name" required>
//required は、その入力欄を空のまま送信できなくする HTMLの属性です。
</label>
</p>
<p>
<label>ふりがな:
<input type="text" name="kana" required>
</label>
</p>
<p>
<label>電話番号:
<input type="tel" name="tel" required>
</label>
</p>
<button type="submit">送信する</button>
</form>
</body>
</html>
php-basic1010receive.php
<?php
// 初期化
$name = '';
$kana = '';
$tel = '';
// POSTかどうかをチェック
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// サニタイズして変数に代入
if (isset($_POST['name'])) {
$name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
}
if (isset($_POST['kana'])) {
$kana = htmlspecialchars($_POST['kana'], ENT_QUOTES, 'UTF-8');
}
if (isset($_POST['tel'])) {
$tel = htmlspecialchars($_POST['tel'], ENT_QUOTES, 'UTF-8');
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>受信結果(POST)</title>
</head>
<body>
<h1>送信された内容(POST)</h1>
<?php if (!empty($name) && !empty($kana) && !empty($tel)): ?>
<p><strong>お名前:</strong><?php echo $name; ?></p>
<p><strong>ふりがな:</strong><?php echo $kana; ?></p>
<p><strong>電話番号:</strong><?php echo $tel; ?></p>
<?php else: ?>
<p>入力内容が正しく送信されていません。</p>
<?php endif; ?>
<p><a href="php-basic08post_send.php">戻る</a></p>
</body>
</html>
$_SERVER['REQUEST_METHOD'] === 'POST' とは?
送信されたリクエストが POST かどうかを判定するための条件式です。
POST は、間違って送られたり、2回送信されると登録の重複や不具合につながるため、慎重に扱う必要があります。
一方で GET は、検索やページ表示などの目的で使われ、何度アクセスしても問題のない場面が多いため、送信方法の判定を省略することもあります。
表示確認の手順
下記のコード入力が終わったら、以下の手順で動作を確認してみましょう。
- XAMPP を起動
「Apache」が起動していることを確認します。 - ブラウザを開く
Google Chrome など、普段使っているブラウザを開きます。 - アドレスバーに入力
次のURLを直接入力して Enter を押します
http://localhost/php-basic/
- 01.php をクリック
フォルダ一覧の中に「02.php」というファイル名が見えたら、それをクリックしてください。 - ページが表示されれば成功!
「PHP基礎学習のスタートです」や「ウェブトレーニングで頑張りましょう」などの文字が表示されていれば、PHPが正しく動いています。
