解答例


HTMLファイル

PHPスクリプト


PDO版の解答例

上の解答例は従来のmysqli版です。現在の書き方に合わせて,プリペアドステートメントを使うPDO版も示します。フォーム側はactionでPDO版の処理ファイルを指定し,PHP側ではprepare()execute()を使って,フォームから送られた値をSQL文に埋め込みます。

HTMLファイル例:lesson4_pdo.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登録ページ</title>
</head>
<body>

<h1>登録ページ</h1>

<form action="lesson4_do_pdo.php" method="post">

<table border="1">
    <tr>
        <td>氏名</td>
        <td><input type="text" name="氏名"></td>
    </tr>

    <tr>
        <td>性別</td>
        <td>
            <label><input type="radio" name="性別" value="男">男</label>
            <label><input type="radio" name="性別" value="女">女</label>
        </td>
    </tr>

    <tr>
        <td>好きな色</td>
        <td>
            <label><input type="radio" name="color" value="red">赤</label>
            <label><input type="radio" name="color" value="blue">青</label>
            <label><input type="radio" name="color" value="green">緑</label>
            <label><input type="radio" name="color" value="yellow">黄</label>
        </td>
    </tr>

    <tr>
        <td>出身</td>
        <td>
            <select name="pref" id="pref">
                <option value="北海道">北海道</option>
                <option value="青森県">青森県</option>
                <option value="岩手県">岩手県</option>
                <option value="宮城県">宮城県</option>
                <option value="秋田県">秋田県</option>
                <option value="山形県">山形県</option>
                <option value="福島県">福島県</option>
                <option value="茨城県">茨城県</option>
                <option value="栃木県">栃木県</option>
                <option value="群馬県">群馬県</option>
                <option value="埼玉県">埼玉県</option>
                <option value="千葉県">千葉県</option>
                <option value="東京都">東京都</option>
                <option value="神奈川県">神奈川県</option>
                <option value="新潟県">新潟県</option>
                <option value="富山県">富山県</option>
                <option value="石川県">石川県</option>
                <option value="福井県">福井県</option>
                <option value="山梨県">山梨県</option>
                <option value="長野県">長野県</option>
                <option value="岐阜県">岐阜県</option>
                <option value="静岡県">静岡県</option>
                <option value="愛知県">愛知県</option>
                <option value="三重県">三重県</option>
                <option value="滋賀県">滋賀県</option>
                <option value="京都府">京都府</option>
                <option value="大阪府">大阪府</option>
                <option value="兵庫県">兵庫県</option>
                <option value="奈良県">奈良県</option>
                <option value="和歌山県">和歌山県</option>
                <option value="鳥取県">鳥取県</option>
                <option value="島根県">島根県</option>
                <option value="岡山県">岡山県</option>
                <option value="広島県">広島県</option>
                <option value="山口県">山口県</option>
                <option value="徳島県">徳島県</option>
                <option value="香川県">香川県</option>
                <option value="愛媛県">愛媛県</option>
                <option value="高知県">高知県</option>
                <option value="福岡県">福岡県</option>
                <option value="佐賀県">佐賀県</option>
                <option value="長崎県">長崎県</option>
                <option value="熊本県">熊本県</option>
                <option value="大分県">大分県</option>
                <option value="宮崎県">宮崎県</option>
                <option value="鹿児島県">鹿児島県</option>
                <option value="沖縄県">沖縄県</option>
            </select>
        </td>
    </tr>

    <tr>
        <td>コメント</td>
        <td><textarea name="free" rows="5" cols="50">自由に意見を記述してください</textarea></td>
    </tr>
</table>

<input type="submit" value="登録する">
<input type="reset" value="リセット">

</form>

</body>
</html>

PHPスクリプト例:lesson4_do_pdo.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>アンケート回答の保存</title>
</head>
<body>
<?php
// 画面表示用のエスケープ処理
function h($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

// フォームから送られた値を取り出す
$name    = $_POST['氏名'] ?? '';
$sex     = $_POST['性別'] ?? '';
$color   = $_POST['color'] ?? '';
$pref    = $_POST['pref'] ?? '';
$comment = $_POST['free'] ?? '';

try {
    // MySQLサーバ接続とデータベース選択
    $dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
    $user = 'root';
    $password = '';

    $dbh = new PDO($dsn, $user, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ]);

    // プレースホルダを使ってSQL文を準備する
    $sql = 'INSERT INTO member (name, sex, color, pref, `comment`)
            VALUES (:name, :sex, :color, :pref, :comment)';
    $stmt = $dbh->prepare($sql);

    // フォームの値をSQL文に渡して実行する
    $stmt->execute([
        ':name'    => $name,
        ':sex'     => $sex,
        ':color'   => $color,
        ':pref'    => $pref,
        ':comment' => $comment,
    ]);

    echo '<p>データを登録しました。</p>';

    echo '<h2>登録内容</h2>';
    echo '<ul>';
    echo '<li>氏名:' . h($name) . '</li>';
    echo '<li>性別:' . h($sex) . '</li>';
    echo '<li>好きな色:' . h($color) . '</li>';
    echo '<li>出身:' . h($pref) . '</li>';
    echo '<li>コメント:' . nl2br(h($comment)) . '</li>';
    echo '</ul>';
} catch (PDOException $e) {
    echo '<p>データベース処理でエラーが発生しました。</p>';
    // 学習時に原因を確認したい場合だけ,次の行を有効にします。
    // echo '<pre>' . h($e->getMessage()) . '</pre>';
}
?>
</body>
</html>

実際に動作確認するためのファイルは,PDO版解答ファイルとしてまとめてあります。

PDO版では,mysqli_real_escape_string()で値を文字列連結する代わりに,:name:sexのようなプレースホルダを使います。これにより,フォームから送られた値をSQL文の一部として直接連結しないため,SQLインジェクション対策としても有効です。

上記の例では,フォームの項目名は従来版に合わせて氏名性別colorpreffreeのままにしています。一方,データベース側のカラム名はnamesexcolorprefcommentを想定しています。


Copyright (c) 2014-2026 幸谷研究室 @ 追手門学院大学 All rights reserved.
Copyright (c) 2014-2026 T.Kouya Laboratory @ Otemon Gakuin University. All rights reserved.