2012-04-20 5 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와 하위 범주 테이블, 하위 범주, & 차 카테고리와 카테고리 테이블이 신분증. 나는 그것을 실행하고 처음 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이 코드의 끝에 가져온, 그래서 이 코드는 작동하지 않습니다.

나는 당신이이 while 내에서 foreach이 괜찮은지 시간이 있습니다이

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 오류가 발생합니다. 두 번째로 외부 while 루프의 모든 반복에 대해 하위 카테고리 쿼리를 실행하고 있습니다. 즉, 쿼리가 100 개의 행을 반환하면 100 개의 쿼리를 발행합니다.

가장 좋은 방법은 두 테이블 사이에 조인을 만들고 하나의 루프, 바람직하게는 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'; 

당신은 모든 범주와 관련 하위 범주를 검색 단일 쿼리가, 지금은 하나의로 단계별로 실행할 수 있습니다 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>'; 
    } 
} 
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

관련 문제