PHPのフォーム入力とデータの受け取り

📁 作成ファイル・保存場所

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');
Webtraining - Webトレは、 初心...
PHP スーパーグローバル変数まとめ | Webtraining - Webトレは、 初心者から実務までのWeb学習トレーニン... スーパーグローバル変数とは? PHPでプログラムを書いていると、フォームの入力内容を受け取ったり、URLに含まれる値を使ったり する場面がよく出てきます。こうした「外部...

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');
&lt;script&gt;alert(&quot;危険!&quot;);&lt;/script&gt;

となり、ただの文字列として安全に表示されます。このように、不正なコードを無害化する処理を「サニタイズ(sanitize)」と呼びます。PHPでは、画面表示の前に htmlspecialchars() を使うことが基本ルールです。

<?php if (!empty($keyword)): ?> とは?

この条件分岐は、$keyword が空でないとき(=何か入力されているとき)に、処理を実行するための書き方です。empty() は、変数が空であるかを調べる関数です。空文字("")、0nullfalse、空の配列などを「空」とみなします。

!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 は、検索やページ表示などの目的で使われ、何度アクセスしても問題のない場面が多いため、送信方法の判定を省略することもあります。

表示確認の手順

下記のコード入力が終わったら、以下の手順で動作を確認してみましょう。

  1. XAMPP を起動
     「Apache」が起動していることを確認します。
  2. ブラウザを開く
     Google Chrome など、普段使っているブラウザを開きます。
  3. アドレスバーに入力
     次のURLを直接入力して Enter を押します
http://localhost/php-basic/
  1. 01.php をクリック
     フォルダ一覧の中に「02.php」というファイル名が見えたら、それをクリックしてください。
  2. ページが表示されれば成功!
     「PHP基礎学習のスタートです」や「ウェブトレーニングで頑張りましょう」などの文字が表示されていれば、PHPが正しく動いています。