質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.91%

プルダウン選択時にMySQLの値を参照し、2つ目のプルダウンに表示させたい

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 8,266

score 12

前提・実現したいこと

・MySQLのデータとphpを使って連動式プルダウンを作りたい

発生している問題・エラーメッセージ

現在phpとMySQLの勉強中です。
MySQLのデータをプルダウンに表示し、表示することは出来たのですが、連動式プルダウンを作成する方法がいまいちわか、ご教授頂ければ幸いです。

修正版

<html lang="ja">
<head>
  <title></title>
</head>
<body>

<?php
// 接続設定(サーバ/データベース/ユーザ/パスワード)
define("DBSV", "xxxx");
define("DBNAME", "xxxx");
define("DBUSER", "xxxx");
define("DBPASS", "xxxx");

//ni_set( 'display_errors', 1 );


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

// 選択リストの値を取得
$exprice = "price";
$exprice2 = "price2";

echo "<br>";
echo $_POST["price"]; # => JPY
echo "<br>";
echo $_POST["price2"]; # => USD
echo "<br>";


//$rate = "SELECT" $exprice2 "FROM exchange2 where price"=$exprice;

$rate = "SELECT" $exprice2 "FROM exchange2 where price"=$exprice;

$val = $_POST["$exprice"];
$kekka = $_POST["yen"] * $rate;

// データベースに接続
$conn = conndb();
?>
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
  <table>
    <tr>
      <td><input type="text" name="yen" size="20" value="" />円を</td>
      <td><?php echo disp_list($conn, "exchange2", "price", "country", $val, $exprice); ?>から</td>
      <td><?php echo disp_list($conn, "exchange2", "price", "country", $val, $exprice2); ?></td>
      <td><input type="submit" value="変換"></td>
    </tr>
  </table>
</form>
<b><?php echo $kekka;
?></b>

</body>
</html>

<?php
// データベース接続の解除
closedb($conn);
?>
<?php

//------------------------------
// 関数
//------------------------------

// 選択リストを出力する関数
// パラメータ:接続/テーブル名/リスト値/表示値/選択値/リスト名
function disp_list($conn, $table, $value, $text, $selected_value = "", $m_name) {
    // DBから製品情報を取り出す
    $sql = "SELECT * FROM " . $table . " ASC" . $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;
    }
}
?>
```  
mysql> SELECT * FROM exchange;  
+------+--------------------------+-----------+-------+  
| id   | country                  | price     | money |  
+------+--------------------------+-----------+-------+  
|    1 | 日本                     | 1         | JPY   |  
|    2 | 韓国                     | 11.15546  | KRW   |  
|    3 | 中国                     | 0.06624   | CNY   |  
|    4 | インドネシア             | 131.64439 | IDR   |  
|    5 | インド                   | 0.66647   | INR   |  
|    6 | サウジアラビア           | 0.03734   | SAR   |  
|    7 | 欧州連合                 | 0.00883   | EUR   |  
|    8 | フランス                 | 0.00883   | EUR   |  
|    9 | ドイツ                   | 0.00881   | EUR   |  
|   10 | イタリア                 | 0.00881   | EUR   |  
|   11 | イギリス                 | 0.00754   | GBR   |  
|   12 | カナダ                   | 0.01286   | CAD   |  
|   13 | メキシコ                 | 0.18282   | MXN   |  
|   14 | アメリカ合衆国           | 0.00995   | USD   |  
|   15 | アルゼンチン             | 0.14773   | ARS   |  
|   16 | ブラジル                 | 0.03216   | BRL   |  
|   17 | ロシア                   | 0.64162   | RUB   |  
|   18 | トルコ                   | 0.0292    | TRY   |  
|   19 | 南アフリカ共和国         | 0.14092   | ZAR   |  
|   20 | オーストラリア           | 0.01306   | AUD   |  
+------+--------------------------+-----------+-------+  

↓MySQL 新DB

```
mysql> SELECT * FROM exchange2;
+--------------------------+-------+------------+-------------+----------+--------------+-----------+----------+----------+----------+----------+-----------+----------+-----------+----------+-----------+----------+-----------+----------+
| country                  | price | JPY        | KRW         | CNY      | IDR          | INR       | SAR      | EUR      | GBP      | CAD      | MXN       | USD      | ARS       | BRL      | RUB       | TRY      | ZAR       | AUD      |
+--------------------------+-------+------------+-------------+----------+--------------+-----------+----------+----------+----------+----------+-----------+----------+-----------+----------+-----------+----------+-----------+----------+
| 日本                     | JPY   |   1.000000 |   11.015620 | 0.065500 |    11.015620 |  0.659340 | 0.036830 | 0.008770 | 0.007480 | 0.012750 |  0.182360 | 0.009820 |  0.147150 | 0.032060 |  0.635520 | 0.028990 |  0.139380 | 0.012970 |
| 韓国                     | KRW   |   0.090940 |    1.000000 | 0.005950 |    11.774410 |  0.059850 | 0.003340 | 0.000800 | 0.000680 | 0.001160 |  0.016590 | 0.000890 |  0.013290 | 0.002910 |  0.057530 | 0.002640 |  0.012780 | 0.001180 |
| 中国                     | CNY   |  15.290160 |  168.171190 | 1.000000 |  1980.116360 | 10.065830 | 0.562340 | 0.133850 | 0.114160 | 0.195130 | 19.006420 | 0.149950 |  2.234290 | 0.489560 |  9.699290 | 0.442760 |  2.141180 | 0.198570 |
| インドネシア             | IDR   |   0.007710 |    0.084960 | 0.000510 |     1.000000 |  0.005090 | 0.000280 | 0.000060 | 0.000100 | 0.000100 |  0.001410 | 0.000100 |  0.001130 | 0.000250 |  0.004900 | 0.000220 |  0.001080 | 0.000100 |
| インド                   | INR   |   1.518020 |   16.751560 | 0.099400 |   197.721180 |  1.000000 | 0.055850 | 0.013300 | 0.011350 | 0.019380 |  0.277000 | 0.014890 |  0.221920 | 0.048620 |  0.965050 | 0.044010 |  0.213370 | 0.019750 |
| サウジアラビア           | SAR   |  27.186740 |  299.752010 | 1.782620 |  3542.572200 | 17.898190 | 1.000000 | 0.238020 | 0.203190 | 0.346790 |  4.959010 | 0.266660 |  3.973230 | 0.870480 | 17.278130 | 0.788030 |  3.817470 | 0.353480 |
| EU                       | EUR   | 114.034500 | 1256.160390 | 7.469530 | 14784.946240 | 75.187050 | 4.200380 | 1.000000 | 0.852600 | 1.454410 | 20.795250 | 1.120070 | 16.779790 | 3.656030 | 72.470880 | 3.306230 | 15.893820 | 1.479280 |
| イギリス                 | GBP   | 133.847770 | 1474.934380 | 8.764830 | 17423.884510 | 88.083990 | 4.921390 | 1.171650 | 1.000000 | 1.707610 | 24.417190 | 1.312340 | 19.553810 | 4.283990 | 85.016010 | 3.877300 | 18.786880 | 1.740550 |
| メキシコ                 | MXN   |   5.487480 |   60.438140 | 0.358910 |   713.379700 |  3.609090 | 0.201560 | 0.048000 | 0.040970 | 0.069960 |  1.000000 | 0.053750 |  0.800830 | 0.175460 |  3.480690 | 0.158830 |  0.769680 | 0.071330 |
| アメリカ合衆国           | USD   | 101.953000 | 1124.100000 | 6.685000 | 13285.000000 | 67.120000 | 3.750100 | 0.892600 | 0.762000 | 1.300500 | 18.596800 | 1.000000 | 14.900000 | 3.264400 | 64.794700 | 2.955200 | 14.315900 | 1.325600 |
| アルゼンチン             | ARS   |   6.850870 |   75.476510 | 0.448150 |   890.939600 |  4.507380 | 0.251680 | 0.059940 | 0.051160 | 0.087340 |  1.248610 | 0.067110 |  1.000000 | 0.219090 |  4.345190 | 0.198280 |  0.960650 | 0.089040 |
| ブラジル                 | BRL   |  31.190830 |  343.586290 | 2.043070 |  4043.993750 | 20.565240 | 1.148890 | 0.273520 | 0.233200 | 0.397810 |  5.687940 | 0.306360 |  4.589630 | 1.000000 | 19.822310 | 0.904320 |  4.347290 | 0.404610 |
| ロシア                   | RUB   |   1.573000 |   17.304990 | 0.102900 |   203.756020 |  1.037800 | 0.057860 | 0.013790 | 0.011760 | 0.020060 |  0.286030 | 0.015430 |  0.229910 | 0.050400 |  1.000000 | 0.045520 |  0.220820 | 0.020410 |
| トルコ                   | TRY   |  34.490820 |  379.937670 | 2.259230 |  4471.847690 | 22.741040 | 1.270450 | 0.302460 | 0.257880 | 0.439900 |  6.289720 | 0.338780 |  5.075210 | 1.105800 | 21.919510 | 1.000000 |  4.807240 | 0.447420 |
| 南アフリカ共和国         | ZAR   |   7.114710 |   78.541270 | 0.465380 |    21.919510 |  4.684700 | 0.261740 | 0.062320 | 0.053210 | 0.090820 |  1.297910 | 0.069800 |  1.039960 | 0.227840 |  4.499910 | 0.206170 |  1.000000 | 0.092540 |
| オーストラリア           | AUD   |  77.011990 |  848.224380 | 5.032950 |  9994.722160 | 50.629570 | 2.827490 | 0.673150 | 0.574610 | 0.980920 | 14.024810 | 0.753980 | 11.234260 | 2.461360 | 48.815050 | 2.228000 | 10.790550 | 1.000000 |
| カナダ                   | CAD   |  78.383030 |  863.741160 | 5.132800 | 10203.658160 | 51.583150 | 2.882030 | 0.686140 | 0.585610 | 1.000000 | 14.299030 | 0.768520 | 11.450970 | 2.508760 | 49.786500 | 2.270600 | 11.001840 | 1.019290 |
+--------------------------+-------+------------+-------------+----------+--------------+-----------+----------+----------+----------+----------+-----------+----------+-----------+----------+-----------+----------+-----------+----------+

数字を入れてプルダウンした国を選択すると日本円→その国の通貨になります。
この状態から新しいDBに換装し、プルダウンを増やして中国→アメリカ通貨のように変えることは可能でしょうか?

補足情報(言語/FW/ツール等のバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

コメントのソースコードを NetBeans のエディタに貼り付けてみました。

イメージ説明

Syntax Error なんぞ、嫌でも指摘してくれるようなものです。
しょうもないエラーで作業が止まるくらいなら、まともなIDE(統合開発環境)を使って開発すべきです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/30 10:15

    返信が遅れて申し訳ございません。

    現在研修中でして、作業環境を変えられないのです…

    キャンセル

checkベストアンサー

0

とりあえず国名リストを2つ表示したいなら

SELECT country,money FROM exchange ORDER BY id ASC;
した上で、optionのvalueにmaneyを、コンテキストにcountryを表示すればよいでしょう。

2つのセレクトボックスから得たmoney1とmoney2から
SELECT $money2 as rate FROM exchange2 WHERE price=$money
のように値を得てください。
この場合$moneyはプレースホルダーで処理できますが$money2は
カラム名のため与えられません。
$money2をバリデートで想定した20個のどれかだったことをチェックし
sprintfなどで渡してやることになると思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/30 18:11

    返信が遅れてしまい、申し訳ございません。
    その後、色々と先輩にも教えてもらうことが出来まして、解決いたしました。
    わかりやすい回答ありがとうございました。

    キャンセル

0

exchangeからexchange2への換装まで実装したんですよね?
何がわからないのでしょうか?
もしくは換装の仕方がわからないというご質問でしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/29 18:49

    exchange2への換装が終了しております。

    select from whereを使用してMySQL内の数値を取り出せるようにしたいのです。

    その後調べながらやったのですが、

    // 選択リストの値を取得
    $exprice = "price";
    $exprice2 = "price2";

    echo "<br>";
    echo $_POST["price"];
    echo "<br>";
    echo $_POST["price2"];
    echo "<br>";

    $rate = "SELECT" $exprice2 "FROM exchange2 where price"=$exprice;

    $val = $_POST["$exprice"];
    $kekka = $_POST["yen"] * $rate;

    // データベースに接続
    $conn = conndb();
    ?>
    <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
    <table>
    <tr>
    <td><input type="text" name="yen" size="20" value="" />円を</td>
    <td><?php echo disp_list($conn, "exchange2", "price", "country", $val, $exprice); ?>から</td>
    <td><?php echo disp_list($conn, "exchange2", "price", "country", $val, $exprice2); ?>へ</td>
    <td><input type="submit" value="変換"></td>
    </tr>
    </table>
    </form>
    <b><?php echo $kekka;
    ?></b>

    という風に変更しました。

    echo $_POST["price"];とecho $_POST["price2"];の部分ではちゃんとMySQLからpriceを所得することに成功してるのですがselect from whereを使用して数値を出そうとすると、
    PHP Parse error: syntax error, unexpected T_VARIABLEとなってしまいました。

    キャンセル

0

2重投稿の為、削除しました

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

<html lang="ja">
<head>
  <title></title>
</head>
<body>

<?php
// 接続設定(サーバ/データベース/ユーザ/パスワード)
define("DBSV", "localhost");
define("DBNAME", "conversion");
define("DBUSER", "root");
define("DBPASS", "fl201504");

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

// 選択リストの値を取得
$exprice = "price1";
$exprice2 = "price2";
//$val = $_POST["$exprice"];
$val = "";
$kekka = "";

// データベースに接続
$conn = conndb();

if(isset($_POST['submit'])){
        // POSTで送信された通貨を取得
        $currency1 = $_POST["price1"]; # 変換元の通貨
        $currency2 = $_POST["price2"]; # 変換先の通貨
        //echo "<br />";
        //echo "変換元の通貨-> " . $currency1;
        //echo "<br />";
        //echo "変換先の通貨-> " . $currency2;
        //echo "<br />";

        // レートをデータベースから取得
        $result = mysql_query("SELECT $currency2 FROM exchange2 WHERE price = '$currency1'");

        $row = mysql_fetch_assoc($result);
        //print('<p>');
        //print('id='.$row["$currency2"]);
        //    print(',name='.$row["$currency1"]);
        //print('</p>');

        // 入力された値とレートで計算して結果を求める
        $kekka = $_POST["yen"] * $row["$currency2"];
}

?>
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
  <table>
    <tr>
      <td><input type="text" name="yen" size="20" value="" />通貨を</td>
      <td><?php echo disp_list($conn, "exchange2", "price", "country", $val, $exprice); ?>から</td>
      <td><?php echo disp_list($conn, "exchange2", "price", "country", $val, $exprice2); ?>へ</td>
      <td><input type="submit" name='submit' value="変換"></td>
    </tr>
  </table>
</form>
<b>

<?php
// 結果を表示
echo "$kekka";
?>
</b>

</body>
</html>

<?php
// データベース接続の解除
closedb($conn);
?>
<?php

//------------------------------
// 関数
//------------------------------

// 選択リストを出力する関数
// パラメータ:接続/テーブル名/リスト値/表示値/選択値/リスト名
function disp_list($conn, $table, $value, $text, $selected_value = "", $m_name) {
    // DBから製品情報を取り出す
    $sql = "SELECT * FROM " . $table . " ASC" . $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;
    }
}


?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る