HTMLファイル
PHPスクリプト
上の解答例は従来のmysqli版です。現在の書き方に合わせて,プリペアドステートメントを使うPDO版も示します。フォーム側はactionでPDO版の処理ファイルを指定し,PHP側ではprepare()とexecute()を使って,フォームから送られた値をSQL文に埋め込みます。
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>
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インジェクション対策としても有効です。
上記の例では,フォームの項目名は従来版に合わせて氏名,性別,color,pref,freeのままにしています。一方,データベース側のカラム名はname,sex,color,pref,commentを想定しています。