0

これを実行した後、私は奇妙なリストを取得し続けます:

<?php 
  $query_Category = "SELECT * FROM blog_categories ORDER BY category ASC";

  $getCategory = mysql_query($query_Category) or die(mysql_error()); 
?>

<div id="sheader" style="">Categories</div>

<div class="sbody" style="color:#000 !important;">

<?php 
   do { 
?>
    <div><?php echo $row_getCategory['category'];?></div>

<?php 
    $cat = $row_getCategory['cat_id'];

    $query_Subcategory = "SELECT * FROM blog_subcategories WHERE primcat_id = '$cat' ORDER BY subcategory ASC";

    $getSubCategory = mysql_query($query_Subcategory) or die(mysql_error());
    $row_getSubCategory = mysql_fetch_assoc($getSubCategory);

    $str = $row_getSubCategory['subcategory']; $subcategory = explode(',', $str);

    foreach ($subcategory as $arraysubcat) 
    {
       echo '<div>' . $arraysubcat . '</div>';
    }
    } while ($row_getCategory = mysql_fetch_assoc($getCategory)); 
?>

</div>
<?php mysql_free_result($getCategory); ?>

IDとカテゴリを含むカテゴリテーブルと、ID、サブカテゴリ、およびプライマリカテゴリIDを含むサブカテゴリテーブルがあります。実行すると、最初に foreach がランダムに表示されます。

4

4 に答える 4

2

私の頭はあなたのコードから本当に痛いです、しかし私はあなたの問題がここにあると信じています:

$cat = $row_getCategory['cat_id'];

$ row_getCategoryはコードの最後でフェッチされるため、このコードは機能しません。

私はあなたがこのようなことをしたいと思っていると思います

while ($row_getCategory = mysql_fetch_assoc($getCategory))
{
    $cat = $row_getCategory['cat_id'];

    $query_Subcategory = "SELECT * FROM blog_subcategories WHERE primcat_id = '$cat' ORDER BY subcategory ASC";

    $getSubCategory = mysql_query($query_Subcategory) or die(mysql_error());
    $row_getSubCategory = mysql_fetch_assoc($getSubCategory);

    $str         = $row_getSubCategory['subcategory'];
    $subcategory = explode(',', $str);

    foreach ($subcategory as $arraysubcat) {
        echo '<div>' . $arraysubcat . '</div>';
    }

    }

}
于 2012-04-20T05:41:32.813 に答える
2

aforeach内に aを入れても問題ない場合もありますwhileが、これはその 1 つではありません。最初にdo ... while、行が見つかったかどうかに関係なく、すべてのコードをステップ実行することを意味するループを実行しているため、データベースに行が存在しない場合、おそらくundefined indexエラーが発生します。次に、外側の while ループの反復ごとにサブカテゴリ クエリを実行しています。これは、クエリが 100 行を返す場合、100 個のクエリを発行していることを意味します。これは良くありません。

最善の策は、2 つのテーブル間に結合を作成し、1 つのループ、できれば while ループ (対do ... whileループ) で行をステップ実行することです。

このようなもの:

// Made some assumptions with the query, as no schema was posted
// But should give you a starting point
$sql = 
'SELECT bc.*, GROUP_CONCAT(bsc.subcategory) AS sub_categories ' .
'FROM blog_categories AS BC INNER JOIN blog_subcategories AS bsc ON bsc.primcat_id = bc.id ' .
'GROUP BY bc.id ' .
'ORDER BY bc.category ASC';

これで、すべてのカテゴリとそれに関連付けられたサブカテゴリを取得する 1 つのクエリだけになりました。これで、1 つの while ループでそれらをステップ実行できます。

$query = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_assoc($query)) {

    <div>
      <?php echo $row['category']; ?>
    </div>

    // To get at subcategories you can do this
    $subCategories = array_map('trim', explode(',', $row['sub_categories']));

    // And sort them ASC
    sort($subCategories);

    foreach ($subCategories as $subCategory) {
        echo '<div>' . $subCategory . '</div>';
    }
}
于 2012-04-20T05:51:04.527 に答える
1

do whileデータベースからデータを取得するために使用するべきではないと思います。条件をチェックする前にループを1回実行するwhileため、ループを使用する必要があります。したがって、最初のループでは、変数do whileにデータを取得しません 。echo $row_getCategory['category'];したがって、次のコードを使用してみてください。

<?php
while ($row_getCategory = mysql_fetch_assoc($getCategory)){
?>
        <div>
          <?php
            echo $row_getCategory['category'];      
           ?>
        </div>
        <?php
            $cat = $row_getCategory['cat_id'];

            $query_Subcategory = "SELECT * FROM blog_subcategories WHERE primcat_id = '$cat' ORDER BY subcategory ASC";

            $getSubCategory = mysql_query($query_Subcategory) or die(mysql_error());
            $row_getSubCategory = mysql_fetch_assoc($getSubCategory);

            $str         = $row_getSubCategory['subcategory'];
            $subcategory = explode(',', $str);

            foreach ($subcategory as $arraysubcat) {
                echo '<div>' . $arraysubcat . '</div>';
            }
        ?>
<?php
} 
?>
于 2012-04-20T05:40:52.897 に答える