PHP、データベースを使用して、プルダウンリストを動的生成。

web上結果イメージ

ソースコード

<html>
<head>
<title></title>
</head>
<body>
<?php
// 接続設定(サーバ/データベース/ユーザ/パスワード)
define("DBSV", "DBホスト名");
define("DBNAME", "DB名");
define("DBUSER", "ユーザ名");
define("DBPASS", "パスワード");

// 文字コード設定
define("ENCDISP", "UTF-8"); //表示文字コード
define("ENCDB", "UTF-8"); //データベース文字コード

// 選択リストの値を取得
$menu = "menu1";
$val = $_POST[$menu];

// データベースに接続
$conn = conndb();
?>
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
  <table>
    <tr>
      <td><?php echo disp_list($conn, "product", "id", "name", $val, $menu); ?></td>
    </tr>
  </table>
</form>
</body>
</html>
<?php
// データベース接続の解除
closedb($conn);
?>
<?php
//------------------------------
// 関数
//------------------------------

// 選択リストを出力する関数
// パラメータ:接続/テーブル名/リスト値/表示値/選択値/リスト名
function disp_list($conn, $table, $value, $text,
    $selected_value = "", $m_name) {
    // DBから製品情報を取り出す
    $sql = "SELECT * FROM " . $table . " ORDER BY " . $value;
    $res = mysql_query($sql, $conn) or die("データが取得できませんでした");

    // 取り出した製品情報をプルダウンリストに表示する
    echo "<select name=\"" . $m_name . "\">";
    while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
        echo "<option ";
        if ($selected_value == $row[$value]) {
            echo " selected ";
        }
        echo " value=\"".$row[$value]."\">";
        echo cnv_dispstr($row[$text])."</option>";
    }
    echo "</select>";
}

// DB接続
function conndb() {
    $conn = mysql_connect(DBSV, DBUSER, DBPASS) or die("DBに接続できませんでした");
    mysql_select_db(DBNAME) or die("DBに接続できませんでした");
    return $conn;
}

// DB接続解除
function closedb($conn) {
    mysql_close($conn);
}

// 表示用の文字コードに変換
function cnv_dispstr($string) {
     //文字コードを変換
    $det_enc = mb_detect_encoding($string, ENCDB . ", " . ENCDISP);
    if ($det_enc  and $det_enc != ENCDISP) {
        return mb_convert_encoding($string, ENCDISP, $det_enc);
    }
    else {
        return $string;
    }
}
?>
CREATE TABLE product (
    id int NOT NULL auto_increment,
    name varchar(30),
    PRIMARY KEY (id)
);
INSERT INTO product(name) VALUES('製品A');
INSERT INTO product(name) VALUES('製品B');
INSERT INTO product(name) VALUES('製品C');
INSERT INTO product(name) VALUES('製品D');
INSERT INTO product(name) VALUES('製品E');

※環境によっては、DBなどの文字コードが異なるため文字コード変換もしてある。utf-8のマルチバイト文字は3バイトなため、容量面でデメリットがあるが、グローバルに考えるとutf-8に統一するのいいんじゃないかな思う。
mysql_fetch_array($res, MYSQL_ASSOC))関数について。
1行ずつデータを取り出して、MYSQL_ASSOCを指定することによってテーブルの項目名をインデックスにセットしてます。