2017-04-22 19 views
0

私は同様の回答を探していますが、同様のものは見つけられません。DBの結果を使用して1番目のドロップメニューと1番目のドロップメニューの値を入力します。

私はMySQL DBに2つのテーブルを持っています。 UserおよびTeam。各ユーザーは特定のチームの下にいます。

問題は、2つのドロップダウンリストを設定したいということです。最初のドロップダウンでは、利用可能なすべてのチームを取得する必要があります。 2番目のドロップダウンは、ユーザーが最初のドロップダウンで選択したグループに従ってデータを入力します。したがって、たとえば、ユーザがチームAを選択した場合、2番目のドロップダウンでは、チームAの下に割り当てられたユーザが入力されます。 yourPHPscript.phpで

$sql = "SELECT teamID FROM team"; 
$result = mysql_query($sql); 

echo "<select name='team'>"; 
    while ($row = mysql_fetch_array($result)) { 
     echo "<option value='".$row['teamID']."'>".$row['teamID']."</option>"; 
    } 
echo "</select>"; 
+0

は動的グループはありますか?それは「チーム」と言います。チームはグループですか? Jqueryを使用できますか? – Vbudo

+0

こんにちは@Vbudo。チーム[私はそれをグループと呼んだ]は、チームIDとチームの列を持つテーブルです。はい、私はJQueryを使用することができますが、私はまだそれについては緑です。 – justinc

答えて

0
echo "<select name='team' id='firstSelect'>"; 
while ($row = mysql_fetch_array($result)) { 
    echo "<option value='" . $row['teamID'] ."'>" . $row['teamID'] ." 
         </option>"; 
         } 
         echo "</select>"; 
echo '<div id="secondSelect">new form or select will go here</div>'; 

のjQuery

$('#firstSelect').on('change', function(){ 
    var teamId= $(this).val(); 
     $.post('yourPHPscript.php', 
     { 
     'teamId' : teamId 
     }, 
     function (response, status) { 
      //response is the form or select generated from firstSelect 
      document.getElementById('secondSelect').value= response; 
      // or $('#secondSelect').html(response); 
          }); // end post 
}); // end function 

変数に取るとfirstSelectデータを使用する(私はフォームを示唆して)選択をエコー。それがエコーされると、2番目のdivに表示されます。私はあまりにも多くのタイプミスをしなかったことを願っています。

+0

あなたの親切にこの部分をさらに説明できます.PHPscript.phpで変数を受け取り、firstSelectデータを使用するselect(私はフォームを示唆しています)をエコーし​​ます。それがエコーされると、それは2番目のdiv ' – justinc

0

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
</head> 
<body> 
<?php 
if(!$con=mysqli_connect("host","user","pass","db")){ 
    echo "Failed to connect to MySQL: ",mysqli_connect_error(); 
}else{ 
    $include_empty_teams_query="SELECT T.id AS `Tid`,T.name AS `Tname`,P.id AS `Pid`,P.name AS `Pname` FROM Teams T LEFT JOIN Players P ON T.id=P.teamid GROUP BY T.id,P.id HAVING P.id IS NOT NULL ORDER BY T.name,P.name;"; 
    $exclude_empty_teams_query="SELECT T.id AS `Tid`,T.name AS `Tname`,P.id AS `Pid`,P.name AS `Pname` FROM Teams T LEFT JOIN Players P ON T.id=P.teamid GROUP BY T.id,P.id HAVING P.id IS NOT NULL ORDER BY T.name,P.name;"; 
    if($result=mysqli_query($con,$include_empty_teams_query)){ 
     if(mysqli_num_rows($result)){ 
      $select1="<select name=\"team\"><option value=\"0\">All</option>"; 
      $select2="<select name=\"player\"></select>"; 
      $last_team=NULL; 
       while($row=mysqli_fetch_assoc($result)){ 
        $data[]=$row; 
        if($row["Tname"]!=$last_team){ 
         if($row["Pid"]===NULL){ 
          $select1.="<option disabled>{$row["Tname"]}</option>"; 
         }else{ 
          $select1.="<option value=\"{$row["Tid"]}\">{$row["Tname"]}</option>"; 
         } 
        } 
        $last_team=$row["Tname"]; 
       } 
      $select1.="</select>"; 
      echo $select1," ",$select2; 
      mysqli_free_result($result); 
     }else{ 
      echo "Query Logic Error"; 
     } 
    }else{ 
     echo "Query Syntax Error: ",mysqli_error($con); 
    } 
} 
?> 
</body> 
<script> 
var json=<?=json_encode($data)?>; // cache for future referencing 
$('[name="team"]').on('change',function(e){ 
    var selVal=$(this).find(":selected").val(); 
    if($(this).val()!=0){ // filter json 
     var newOptions=$(json).filter(function(i,sub){return sub.Tid==selVal}); 
    }else{ 
     var newOptions=json; 
    } 
    var $select2=$('[name="player"]'); 
     $select2.empty(); // remove old options 
     $.each(newOptions,function(i,sub){ 
      $select2.append($("<option></option>").attr("value",sub.Pid).text(sub.Pname)); 
     }); 
}).change(); // trigger change() onload 
</script> 
</html> 

レンダリング出力([デフォルト/オンロード] ...あなたのテーブルデータと出力の好みに合わせて、いくつかの再構成を行う必要がありますが、これは私のサーバー/データベース上の加工方法でありますそして【パール・ジャムが選択]):

enter image description hereenter image description here

出力ソースコード:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
</head> 
<body> 
<select name="team"><option value="0">All</option><option value="2">49'ers</option><option value="3">Pearl Jam</option><option value="5">Trump</option><option value="1">Yankees</option></select> <select name="player"></select></body> 
<script> 
var json=[{"Tid":"2","Tname":"49'ers","Pid":"4","Pname":"Jerry Rice"},{"Tid":"2","Tname":"49'ers","Pid":"3","Pname":"Joe Montana"},{"Tid":"3","Tname":"Pearl Jam","Pid":"5","Pname":"Eddie Vedder"},{"Tid":"3","Tname":"Pearl Jam","Pid":"6","Pname":"Jeff Ament"},{"Tid":"3","Tname":"Pearl Jam","Pid":"9","Pname":"Matt Cameron"},{"Tid":"3","Tname":"Pearl Jam","Pid":"8","Pname":"Mike McCready"},{"Tid":"3","Tname":"Pearl Jam","Pid":"7","Pname":"Stone Gossard"},{"Tid":"5","Tname":"Trump","Pid":"10","Pname":"Donald Trump"},{"Tid":"1","Tname":"Yankees","Pid":"2","Pname":"Babe Ruth"},{"Tid":"1","Tname":"Yankees","Pid":"1","Pname":"Mickey Mantle"}]; // cache for future referencing 
$('[name="team"]').on('change',function(e){ 
    var selVal=$(this).find(":selected").val(); 
    if($(this).val()!=0){ // filter json 
     var newOptions=$(json).filter(function(i,sub){return sub.Tid==selVal}); 
    }else{ 
     var newOptions=json; 
    } 
    var $select2=$('[name="player"]'); 
     $select2.empty(); // remove old options 
     $.each(newOptions,function(i,sub){ 
      $select2.append($("<option></option>").attr("value",sub.Pid).text(sub.Pname)); 
     }); 
}).change(); 
</script> 
</html> 
私のコードの

利点は以下のとおりです。

  • 何のAjaxの呼び出しがありません。これは、ユーザーからの複数のチーム変更による不必要なサーバー負荷がないことを意味します。データベースは一度クエリされ、すべてのデータはjavascript変数に格納されます。
  • 私は古いmysql_関数を削除し、mysqli_関数を実装してプロセスを近代化しました。
  • 私は2つの別々のクエリを宣言しましたが、私の投稿に1つしか使用しません。これにより、プレイヤーレスの最初のドロップダウンにチームを含めるかどうかを決めることができます。
  • mysqli_fetch_array()の代わりにmysqli_fetch_assoc()を使用します。これは、提供する数字キーを使用しないためです。
  • プレイヤーレスチームを含む場合、チーム名は表示されますが、disabled属性が表示されます。これは選択できません。これは意図的なUX機能です。私はの省略形として<?=?>を使用
  • $datajson_encode()の周りに、このPHPの値をエコー。
  • 私のjquery onchange関数の最後に.change()を使用しているため、関数はページの読み込み時にトリガされます。
使用し

データベーステーブルが:

CREATE TABLE `Teams` (
    `id` int(10) NOT NULL, 
    `name` varchar(100) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `Teams` (`id`, `name`) VALUES 
(1, 'Yankees'), 
(2, '49\'ers'), 
(3, 'Pearl Jam'), 
(4, 'Empty Team'), 
(5, 'Trump'); 

ALTER TABLE `Teams` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `Teams` 
    MODIFY `id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; 

CREATE TABLE `Players` (
    `id` int(10) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    `teamid` int(10) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `Players` (`id`, `name`, `teamid`) VALUES 
(1, 'Mickey Mantle', 1), 
(2, 'Babe Ruth', 1), 
(3, 'Joe Montana', 2), 
(4, 'Jerry Rice', 2), 
(5, 'Eddie Vedder', 3), 
(6, 'Jeff Ament', 3), 
(7, 'Stone Gossard', 3), 
(8, 'Mike McCready', 3), 
(9, 'Matt Cameron', 3), 
(10, 'Donald Trump', 5); 

ALTER TABLE `Players` 
    ADD PRIMARY KEY (`id`); 

ALTER TABLE `Players` 
    MODIFY `id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11; 
関連する問題