2012-04-20 14 views
0

が、私はこれを実行した後、奇妙なリストを得続けるおかしいながらの内側:Foreachループが

<?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を表示します。

+0

私はちょうどあなたが面白く見える書式設定を考えました。 O.o '$ subcategory'配列は、' explode() 'のように出力されますか? – Blake

+0

@Blake PHP構文hate-festを期待してここに来ました。 –

+0

あなたのコードの書式が修正されました。それでも私にとっては面白く見えますが、これはhttp://beta.phpformatter.com/のようになります。 –

答えて

0

私はdo whileは、最初のループでcondition.Soをチェックする前に、一度ループを実行し、ためではなくwhileループを使用する必要がありますあなたはdatabase.Youからデータを取得するために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 
} 
?> 
+0

感謝のように働いてくれてありがとうございます>私はフォーマットをうまくやろうとします。 – user1345650

1

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

$cat = $row_getCategory['cat_id']; 

$ row_getCategoryので、あなたのコードの末尾に取り込まれ、このコードは動作しません。

私はあなたがそれがwhileforeachを持ってしても大丈夫ですが、これはそのうちの一つではない時間があります。この

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>'; 
    } 

    } 

} 
1

のような何かをしたいと考えています。まず、do ... whileループを実行します。これは、行が見つかったかどうかにかかわらず、すべてのコードをステップ実行するので、データベースに行が存在しない場合は、おそらくundefined indexのエラーが発生します。第2に、外側のwhileループの繰り返しごとにサブカテゴリクエリを実行しています。つまり、クエリが100行を返した場合は、100個のクエリを発行しています。

2つのテーブルの間に結合を作成し、1つのループ、好ましくはwhileループ(vs a 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'; 

今、あなたは今だけあなたがループしながら、単一でそれらをステップ実行することができ、すべてのカテゴリおよびそれに関連するサブカテゴリーを取得し、単一のクエリを持っている:

$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>'; 
    } 
} 
2

カテゴリごとに別のサブクエリを行う必要はありません。ちょうど参加してください。これを試してみてください:

$db = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); 

if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' 
      . $mysqli->connect_error); 
} 

$get_categories = $db -> query("SELECT category, subcategory 
        FROM blog_categories, blog_subcategories 
        WHERE primcat_id = cat_id 
        ORDER BY category ASC, subcategory ASC"); 

echo "<h1>Categories</h1>"; 

echo "<ul>"; 

while($row = $get_categories -> fetch_assoc()) { 
    echo "<li>" . $row['category']; 
    if($row['subcategory']) { 
     echo "<ul>"; 
     foreach(explode(",",$row['subcategory']) as $subcategory) { 
      echo "<li>$subcategory</li>"; 
     } 
     echo "</ul>"; 
    } 
    echo "</li>"; 
} 

echo "</ul>"; 
+1

Awww ...私はちょうど結合されたクエリとネストされたULの(意味的に)ほとんど同じコードを書き終えました。ああ、再転記する必要はありません。^_〜いい仕事! – darin