PHP、データベースを使用して、プルダウンリストを動的生成。
ソースコード
<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を指定することによってテーブルの項目名をインデックスにセットしてます。