2016-12-14 23 views
0

タイトルに記述しようとしたので、同じページの別のドロップダウンリストのIDに応じてMYSQLデータベースから行を選択する際に問題があります。私はmysqlとphpを2ヶ月間しか使用していませんでした。PHP MYSQL - 前のドロップダウンに依存する選択をドロップ

私は以下のヘッダーを持つカテゴリのテーブルを持っています。

| id |名前| parent_id |

parent_idが0の親カテゴリがあります。また、parent_idとして親のidを持つサブカテゴリは、最大1つの子カテゴリの深さまでです。たとえば:

ソフトウェア開発は、ID = 18とPARENT_ID = 0のPHP開発者と親カテゴリは、私は私ができるドロップダウンリストを持っているID = 30とPARENT_ID = 18

を持っているサブカテゴリされています

$p_query = "SELECT * FROM categories WHERE parent_id = 0 ORDER by id ASC"; 

$p_result = mysqli_query($con, $p_query) or die(mysqli_error($con)); 

$categories =''; 
while($p_row = mysqli_fetch_assoc($p_result)) 
     { 
     $categories .='<option class="option" value="p::'.$p_row['id'].'">' .$p_row['category_name'].'</option>'; 
     } 

<select name="categories[]" class="categories form-control" id="categories" style="width:100%" multiple> 
     <?php echo $categories;?> 
</select> 

これは問題なく動作します。しかし、2番目のドロップダウンリストを取得して、parent_idを親カテゴリのIDとして持つ可能なカテゴリを表示しようとすると、「検索結果が見つかりません」というドロップダウンリストが取得されます。以下のコードは私が使用しているものです:

 $subcategories =''; 
    while($p_row = mysqli_fetch_assoc($p_result)) 
      { 
       $c_query = "SELECT * FROM categories WHERE parent_id = ".$categories['id']." ORDER by id ASC"; 

       $c_result = mysqli_query($con, $c_query) or die(mysqli_error($con)); 

       while($c_row = mysqli_fetch_assoc($c_result)) 
       { 
        $subcategories .='<option class="option" value="c::'.$c_row['id'].'">' .$c_row['category_name'].'</option>'; 
       } 

      } 

      <select name="subcategories[]" class="categories form-control" id="subcategories" style="width:100%" multiple> 

          <?php echo $subcategories ?> 
       </select> 

私には紛失しているものがありますか? PHPとMYSQLの両方の初心者として、私は助けや助言を非常に感謝しています。

+1

この問題は、おそらく以前に解決されています。 – Strawberry

+0

'var_dump()'、 'print_r()'と 'echo'はお友達です。デバッグのためにさまざまな場所でそれらを試してみてください。最初に '$ p_result'、次に' $ c_query'などを確認してください。 – user1801810

答えて

0

2番目のクエリでparent_idに基づいてサブカテゴリを取得するのに問題はありません。あなたはそのように簡単にテストすることができます。

SELECT *をカテゴリWHERE

どのようにあなたのコードがこれを作成する際には何もないとして$カテゴリ[「ID」]に値を提供しているのid ASCによってPARENT_ID = 1 ORDER 'id'インデックスを持つ配列ですか?さらにあなたはすでに$ categoriesという文字列を文字列として使用していますので、正当な理由なしにその変数名を再利用するべきではありません。

最初の選択に基づいて2番目の複数の選択ボックスにサブカテゴリを設定すると思われるので、2番目のクエリを送信して2番目のセレクタ要素に結果を書き込むには、javascript + AJAXを使用する必要があります。

jqueryを使用すると少し助けてください。これらの例を試してみてください。カテゴリを選択するためのインタフェースが含まれてい

myselect.php:

<?php 
$con = mysqli_connect("host", "username", "password", "database"); 

$p_query = "SELECT * FROM categories WHERE parent_id = 0 ORDER by id ASC"; 

$p_result = mysqli_query($con, $p_query) or die(mysqli_error($con)); 

$categories =''; 

while($p_row = mysqli_fetch_assoc($p_result)) 
{ 
    $categories .='<option class="option" value="p::'.$p_row['id'].'">' .$p_row['category_name'].'</option>'; 
} 
?> 
<html> 
<head> 
    <script 
      src="https://code.jquery.com/jquery-3.1.1.min.js" 
      integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" 
      crossorigin="anonymous"> 
    </script> 
</head> 
<body> 
Shift or Ctrl + Click to pick more than one<br /> 
<form id="categoryform" method="POST"> 
<select name="categories[]" class="categories form-control" id="categories" style="width:100%" multiple> 
     <?php echo $categories;?> 
</select> 
</form> 
Here's what it contains<br /> 
<form method="POST"> 
<select name="subcategories[]" class="categories form-control" id="subcategories" style="width:100%" multiple DISABLED> 
</select> 

</form> 

<script> 

    $(document).ready(function() { 
     $('#categories').click(function(){ 
      $('#subcategories').children().remove().end(); 
      var data = $('#categoryform').serialize(); 

      $.post("mysubselect.php", data).done(function(data){ 
       var response = JSON.parse(data); 

       for (var k in response){ 
        $('#subcategories').append('<option class="option" value="c::' + response[k]['id'] + '">' + response[k]['category_name'] + '</option>'); 
       } 
      }); 
     }); 
    }) 

</script> 

</body> 
</html> 

そして、ここでは、あなたのAJAXリクエストからデータを返すスクリプトの例です。

mysubselect.php:

<?php 
$con = mysqli_connect("host", "username", "password", "database") or die(mysqli_error()); 
$result = array(); 

foreach ($_POST["categories"] as $k => $v) { 
    $category_token = explode('::', $v); 
    $category_id = mysqli_real_escape_string($con, $category_token[1]); 

    $query = mysqli_query($con, "SELECT * FROM categories WHERE parent_id = " . $category_id . " ORDER BY id ASC") or die(mysqli_error()); 

    while($r = mysqli_fetch_assoc($query)){ 
     $result[] = $r; 
    } 
} 

    print json_encode($result); 
+0

Tomさん、すばやい返信ありがとうございます。私はPHPとMYSQLの相対初心者ですが、JQueryの初心者です。 myselect.phpで提供するスクリプトについては、実際に何が起こっているのかを明確にしたいと思います。 categories []からカテゴリを選択すると、選択したカテゴリの子がリストから削除されますか?そして、選択されたカテゴリーのいずれかがリスト・データに追加され、副選択照会はデータ・リストに関して行われる。 – ochhii

+0

@ochhii正しいです。カテゴリフォーム要素がクリックされるたびに、この例では#subcategoryのchildren要素(オプション)が削除されます。ここでは、PHP開発者とPython開発者をソフトウェア開発の親と2つのエントリとして扱ったとしましょう。 .append()で複製するたびにオプションを削除しなかった場合。 –

関連する問題