[英]Foreach inside of While Loop Looks Funny
運行此命令后,我一直得到一個奇怪的列表:
<?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。
我的頭真的很受您的代碼的傷害,但是我相信您的問題在這里:
$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>';
}
}
}
有時在一段while
內可以進行foreach
是while
,但這不是其中之一。 首先,您正在執行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>';
}
}
您無需為每個類別執行單獨的子查詢。 只需加入即可。 嘗試這個:
$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>";
我認為您不應該使用do while
從數據庫中檢索數據,而應該使用while
循環,因為do while
在檢查條件之前運行一次循環,因此在第一個循環中,您將不會在echo $row_getCategory['category'];
獲取任何數據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
}
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.