【PHPメモ】(恐竜)プルダウンを生成する関数

###１．はじめに

DBのSELECT結果でプルダウンを作成するコードを記述するのが面倒だ。
htmlタグの間にPHPを埋め込む、インデントがややこしい。
さらにコードの量が増えていく。
下記の画像は前に作った[改良恐竜登録ツール(PHP+MYSQL版)]
(https://qiita.com/knowledge87sun/items/aea1c603cab586b7bcf5)の一部。
このハイブリッド選択のコードが結構、ぐちゃぐちゃになっていた。


![select_dino_mysql2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/9be7276d-0154-5f22-22aa-e0a0eb59251f.jpeg)

生成元タイプ1、生成元タイプ2はセレクト状態を維持するプルダウン、
生成元恐竜1と生成元恐竜2は、生成元タイプで選択した項目により変化するプルダウン。
上記のプルダウンを生成する関数を作って、共通プログラム(common_dino2.php)に置けば、効率的に開発が
進められるのではないか(開発とは言えないけど)
勉強もかねて作ってみた。

###２．選択状態を維持するプルダウンを生成する関数

```php:common_dino2.php

  //$name_pulldown_type:プルダウンのname、$str_query0:SQL、$select_type0:プルダウンで選択されたタイプ
  function Make_pulldown_selectedType($db0,$name_pulldown_type,$str_query0,$select_type0)
  {
    $result_a=$db0->prepare($str_query0);
    $result_a->execute();
    echo "<select name=\"$name_pulldown_type\" style=\"width: 100px\">";
      
    while($data0=$result_a->fetch(PDO::FETCH_ASSOC)){
      //$select_type0が$data0['type0']と等しい場合
      if($select_type0 == $data0['type0']){ 
        echo "<option selected>".$data0['type0']."</option>";
      //$select_type0が$data0['type0']と等しくない場合
      }else{
        echo "<option>".$data0['type0']."</option>";
      }
    }  
    echo "</select><br>";
  }

```

###３．生成元タイプで選択した項目により変化するプルダウン

```php:common_dino2.php
  //$name_pulldown:プルダウンのname、$str_query0:SQL、$val1:str_query0のプレースホルダ
  function Make_pulldownDname($db0,$name_pulldown,$str_query0,$val1)
  {
    $result_a=$db0->prepare($str_query0);
    $result_a->bindparam(1,$val1);
    $result_a->execute();
    echo "<select name=\"$name_pulldown\" style=\"width: 280px\">";
    while($data0=$result_a->fetch(PDO::FETCH_ASSOC)){
      echo "<option>".$data0['dname0']."</option>";
    }
    echo "</select><br>";
  }

```

###４．呼び出し元コード例

```php:select_dinotype3.php

//色々省略
<?php 
}else{
  echo "<h1>ハイブリッド選択</h1>";
  require "common_dino2.php";
  
  $dbname="db_dino";
  $dbh= NewPdo($dbname);
  $query_type0 = "SELECT DISTINCT type0 from tbl_dino Where type0 != 'unique'";
 ?>
  <?php 
  $stype1=isset($_POST['dtype01'])?htmlspecialchars($_POST['dtype01']):null;
  $stype2=isset($_POST['dtype02'])?htmlspecialchars($_POST['dtype02']):null;
   ?> 

  <form action="select_dinotype3_mysql.php" method="post">
生成元タイプ1:
   
  <?php Make_pulldown_selectedType($dbh,"dtype01",$query_type0,$stype1); ?>
   
生成元タイプ2:
  <?php Make_pulldown_selectedType($dbh,"dtype02",$query_type0,$stype2); ?>
     
  <input type="submit" value="タイプ確定">
  </form>

<?php 
  $dbname="db_dino";
  $dbh= NewPdo($dbname);

  $query_select_type0 = "SELECT dname0 from tbl_dino where type0 = ?";
 ?>
 
  <form action="hibrid_dino2_mysql.php" method="post">
  
生成元恐竜1：
  <?php 
    Make_pulldownDname($dbh,"dname1",$query_select_type0,$stype1);
   ?>   
生成元恐竜2：
  <?php 
    Make_pulldownDname($dbh,"dname2",$query_select_type0,$stype2);
   ?>   
//色々な処理
```

###５．結果

####(１)．ハイブリッド選択時の画面

![pulldown_beforeselect_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/a732e147-0e63-e036-5048-14b4c3440f65.jpeg)

####(２)．ハイブリッド選択時の画面のソース

![pulldown_beforeselect.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/459343ed-f05a-a9b2-d1bf-cd860a3231aa.jpeg)

####(３)．生成元1タイプと生成元2タイプを選択時の画面
![pulldown_afterselect_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/a292acc3-aa04-faec-d42a-f44309a96f21.jpeg)

####(４)．生成元1タイプと生成元2タイプを選択時のソース

![pulldown_afterselect.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/c5ca78ad-919f-3e67-7c5b-9275bb7698e1.jpeg)

赤枠で選択されたタイプが、青枠では赤枠で選択されたタイプに属する恐竜名が表示されている。