PHPでのプルダウンの作成について

採用はこちら

PHPでプルダウンを作成する場合は、基本的にHTMLのselectタグとoptionタグを使います。

単純なフォームであればHTMLだけでも作れますが、PHPを使うことで、選択肢を動的に生成したり、送信後に選択状態を保持したりできるようになります。

特に実務では、次のようなケースでPHPによるプルダウン生成がよく使われます。

  • 配列のデータから選択肢を作りたい場合
  • データベースの内容をプルダウンに反映したい場合
  • 送信後も選択した内容を保持したい場合
  • 不正な値が送信されていないか確認したい場合

ここでは、PHPでプルダウンを作る基本から、実務で気を付けたいポイントまで、順を追って解説します。

目次

プルダウンの基本構造

まず、HTMLのプルダウンは次のように記述します。

<select name="fruit">
  <option value="apple">りんご</option>
  <option value="banana">バナナ</option>
  <option value="orange">オレンジ</option>
</select>

この状態でもプルダウンとしては機能します。

ただし、選択肢が増えたり、選択内容を動的に変更したい場合には、PHPで生成したほうが管理しやすくなります。

PHPで配列からプルダウンを生成する方法

PHPでは、配列を使ってプルダウンの選択肢をまとめて管理することができます。

<?php
$fruits = [
    'apple' => 'りんご',
    'banana' => 'バナナ',
    'orange' => 'オレンジ'
];
?>

<select name="fruit">
  <?php foreach ($fruits as $value => $label): ?>
    <option value="<?php echo htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8'); ?>">
      <?php echo htmlspecialchars((string)$label, ENT_QUOTES, 'UTF-8'); ?>
    </option>
  <?php endforeach; ?>
</select>

この方法を使うと、選択肢の追加や削除がしやすくなります。

また、表示する文言と送信される値を分けて管理できるため、実務でも扱いやすい書き方です。

たとえば上の例では、appleが送信値で、画面上には「りんご」と表示されます。

送信後も選択状態を保持する方法

フォームでは、送信したあとにユーザーが選んだ内容をそのまま表示しておきたいことがよくあります。

その場合は、送信された値と選択肢を比較し、一致した項目にselected属性を付けます。

<?php
$fruits = [
    'apple' => 'りんご',
    'banana' => 'バナナ',
    'orange' => 'オレンジ'
];

$selectedFruit = $_POST['fruit'] ?? '';
?>

<form method="post">
  <select name="fruit">
    <option value="">選んでください</option>
    <?php foreach ($fruits as $value => $label): ?>
      <?php $selected = ($selectedFruit === $value) ? ' selected' : ''; ?>
      <option value="<?php echo htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8'); ?>"<?php echo $selected; ?>>
        <?php echo htmlspecialchars((string)$label, ENT_QUOTES, 'UTF-8'); ?>
      </option>
    <?php endforeach; ?>
  </select>
  <button type="submit">送信</button>
</form>

このようにしておけば、フォーム送信後も選択内容が維持されるため、ユーザーにとって使いやすいフォームになります。

「選んでください」を最初に表示する

プルダウンでは、最初に未選択の項目を入れておくことがよくあります。

たとえば次のような書き方です。

<option value="">選んでください</option>

この未選択項目を先頭に入れておくことで、ユーザーに「ここを選ぶ必要がある」とわかりやすく伝えられます。

お問い合わせフォームや会員登録フォームなどでは、ほぼ定番の書き方です。

必須項目にする場合の考え方

プルダウンを必須入力にしたい場合は、HTMLではrequired属性を付けることができます。

<select name="fruit" required>

ただし、これだけで完全ではありません。

ブラウザ側のチェックは利用者の環境に左右されるため、最終的にはPHP側でも必ず確認する必要があります。

たとえば、次のように未選択をチェックします。

<?php
$selectedFruit = $_POST['fruit'] ?? '';
$error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if ($selectedFruit === '') {
        $error = '果物を選択してください。';
    }
}
?>

フォーム入力では、画面上で正しく見えていても、実際に送信される値が期待通りとは限りません。

そのため、サーバー側での確認は省略しないことが大切です。

送信された値が正しいか確認する

プルダウンは画面上では選択肢が決まっていますが、送信内容そのものは改ざんされる可能性があります。

そのため、PHPでは「送られてきた値が本当に用意した選択肢の中にあるか」を確認する必要があります。

<?php
$fruits = [
    'apple' => 'りんご',
    'banana' => 'バナナ',
    'orange' => 'オレンジ'
];

$selectedFruit = $_POST['fruit'] ?? '';
$error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if ($selectedFruit === '') {
        $error = '果物を選択してください。';
    } elseif (!array_key_exists($selectedFruit, $fruits)) {
        $error = '不正な値が送信されました。';
    }
}
?>

このチェックを入れておくことで、用意していない値が送信された場合にも適切に対応できます。

htmlspecialchars()でエスケープする理由

プルダウンのvalueや表示文言を出力するときは、htmlspecialchars()を使ってエスケープするのが基本です。

htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8')

これは、HTML特殊文字を安全に出力するための処理です。

もしデータベースや外部入力に不正な文字列が含まれていた場合でも、画面表示時のトラブルやXSSのリスクを抑えやすくなります。

プルダウンは単純な部品に見えますが、外部データを表示する以上は安全な出力を意識することが重要です。

数字のループでプルダウンを作る方法

月や年齢、年数など、連番の選択肢を作りたい場合はfor文を使うと便利です。

<?php
$selectedMonth = $_POST['month'] ?? '';
?>

<select name="month">
  <option value="">月を選択</option>
  <?php for ($i = 1; $i <= 12; $i++): ?>
    <?php $selected = ((string)$i === $selectedMonth) ? ' selected' : ''; ?>
    <option value="<?php echo $i; ?>"<?php echo $selected; ?>>
      <?php echo $i; ?>月
    </option>
  <?php endfor; ?>
</select>

$_POSTで受け取る値は文字列になるため、比較時には(string)$iのように型をそろえておくと安定します。

データベースの値からプルダウンを作る方法

実務では、マスターデータをデータベースから取得して、プルダウンの選択肢にすることも多くあります。

たとえば、カテゴリ一覧や会員一覧、都道府県マスタなどがその例です。

<?php
$pdo = new PDO(
    'mysql:host=localhost;dbname=test;charset=utf8mb4',
    'user',
    'password',
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]
);

$stmt = $pdo->query("SELECT id, category_name FROM categories ORDER BY id");
$categories = $stmt->fetchAll();

$selectedCategory = $_POST['category'] ?? '';
?>

<select name="category">
  <option value="">カテゴリを選択</option>
  <?php foreach ($categories as $category): ?>
    <?php $selected = ((string)$category['id'] === $selectedCategory) ? ' selected' : ''; ?>
    <option value="<?php echo htmlspecialchars((string)$category['id'], ENT_QUOTES, 'UTF-8'); ?>"<?php echo $selected; ?>>
      <?php echo htmlspecialchars((string)$category['category_name'], ENT_QUOTES, 'UTF-8'); ?>
    </option>
  <?php endforeach; ?>
</select>

このようにすれば、データベースの内容に応じて選択肢を自動的に変えられます。

なお、上記のquery()は固定のSQL文なので問題ありませんが、ユーザー入力を条件に使う場合は、prepare()execute()を使ったプリペアドステートメントを利用する必要があります。

複数選択のプルダウンを作る方法

複数の項目を同時に選べるプルダウンを作るには、multiple属性を付けます。

さらに、name属性を配列形式にする必要があります。

<?php
$fruits = [
    'apple' => 'りんご',
    'banana' => 'バナナ',
    'orange' => 'オレンジ',
    'grape' => 'ぶどう'
];

$selectedFruits = $_POST['fruits'] ?? [];
if (!is_array($selectedFruits)) {
    $selectedFruits = [];
}
?>

<select name="fruits[]" multiple size="4">
  <?php foreach ($fruits as $value => $label): ?>
    <?php $selected = in_array($value, $selectedFruits, true) ? ' selected' : ''; ?>
    <option value="<?php echo htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8'); ?>"<?php echo $selected; ?>>
      <?php echo htmlspecialchars((string)$label, ENT_QUOTES, 'UTF-8'); ?>
    </option>
  <?php endforeach; ?>
</select>

この場合、$_POST['fruits']は配列として受け取ります。

そのため、is_array()で配列かどうか確認しておくと、より安全です。

よくある注意点

PHPでプルダウンを作るときは、次の点でつまずくことがよくあります。

まず、selectedの付け方です。

selectedは真偽属性なので、必要なときだけ文字列として出力する形がわかりやすいです。

また、$_POSTで受け取る値は文字列になるため、数値と比較するときは型の違いに注意が必要です。

さらに、HTML側で選択肢を用意していても、サーバー側で値の妥当性を確認しなければ、不正な値を受け取る可能性があります。

もうひとつ重要なのが、出力時のエスケープです。

表示用の文字列だからといってそのまま出力せず、htmlspecialchars()で安全に処理する習慣を付けることが大切です。

実用的なサンプルコード

最後に、基本的な考え方をひと通り含んだサンプルを載せます。

<?php
$prefectures = [
    'tokyo' => '東京都',
    'osaka' => '大阪府',
    'kyoto' => '京都府',
    'fukuoka' => '福岡県'
];

$selectedPrefecture = $_POST['prefecture'] ?? '';
$error = '';
$result = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if ($selectedPrefecture === '') {
        $error = '都道府県を選択してください。';
    } elseif (!array_key_exists($selectedPrefecture, $prefectures)) {
        $error = '不正な値が送信されました。';
    } else {
        $result = '選択された都道府県は「' . $prefectures[$selectedPrefecture] . '」です。';
    }
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>PHPプルダウンのサンプル</title>
</head>
<body>

<form method="post">
  <label for="prefecture">都道府県</label>
  <select name="prefecture" id="prefecture" required>
    <option value="">選んでください</option>
    <?php foreach ($prefectures as $value => $label): ?>
      <?php $selected = ($selectedPrefecture === $value) ? ' selected' : ''; ?>
      <option value="<?php echo htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8'); ?>"<?php echo $selected; ?>>
        <?php echo htmlspecialchars((string)$label, ENT_QUOTES, 'UTF-8'); ?>
      </option>
    <?php endforeach; ?>
  </select>

  <button type="submit">送信</button>
</form>

<?php if ($error !== ''): ?>
  <p><?php echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8'); ?></p>
<?php endif; ?>

<?php if ($result !== ''): ?>
  <p><?php echo htmlspecialchars($result, ENT_QUOTES, 'UTF-8'); ?></p>
<?php endif; ?>

</body>
</html>

このサンプルには、プルダウン生成、選択状態の保持、未選択チェック、不正値チェック、エスケープ処理といった基本要素がひと通り含まれています。

PHPでのプルダウン作成を学ぶうえで、まず押さえておきたい内容がまとまった形です。

まとめ

PHPでプルダウンを作成するときは、単にselectタグを表示するだけでなく、選択肢の管理方法や送信後の扱い方まで考えることが大切です。

特に重要なのは、配列やデータベースから選択肢を動的に生成すること、送信後の選択状態を保持すること、そして送られてきた値が正しいかをPHP側で必ず確認することです。

加えて、出力時にはhtmlspecialchars()を使って安全に表示する必要があります。

基本をしっかり押さえておけば、都道府県選択、カテゴリ選択、会員一覧、年月日選択など、さまざまなフォームに応用できます。

以上、PHPでのプルダウンの作成についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次