【问题标题】:PHP MySQL Loop on two-level data两级数据上的PHP MySQL循环
【发布时间】:2021-09-21 04:09:53
【问题描述】:

我正在尝试使用单个 mysql 查询从 mysql 数据库中提取两层数据,然后使用 php while 循环按顶层分组显示它。

<?php $org = "1";

$row1 = mysqli_prepare($db,"SELECT * FROM menu WHERE org = ? ORDER BY mid DESC"); 
$row1->bind_param("s", $org);
mysqli_stmt_execute($row1); $row2 = mysqli_stmt_get_result($row1);

while($row = mysqli_fetch_array($row2)){ ?>

<div class="category"><?php echo $row["item"]; /* GROUPED*/?>
<div class="item"><?php echo $row["item"]; /* INDIVIDUAL ITEM*/?></div>
</div>

<?php }; ?>
mid parent org item price
1 1 Category 1
2 1 1 Item 1 $10
3 1 1 Item 2 $12
4 1 Category 2
5 4 1 Item 3 $12
6 4 1 Item 4 $90

显然,每个项目只会出现一次,但类别也会出现与基础项目一样多的次数。但是,在代码中,我需要将所有项目分组在同一父类别下。有什么想法吗?

想要的结果

List
Category 1
- Item 1
- Item 2
Category 2
- Item 3
- Item 4

或者就 HTML 代码输出而言:

<div class="category">Parent Category 1<br>
<div class="item">Item 1</div>
<div class="item">Item 2</div>
</div>
<div class="category">Parent Category 3<br>
<div class="item">Item 3</div>
<div class="item">Item 4</div>
</div>

【问题讨论】:

  • 能否以文本形式提供您的数据,请参阅meta.stackoverflow.com/questions/285551/…
  • 为什么你认为 $row["item"] 会在同一个块中输出不同的结果?
  • 另外,这条线实际上是做什么的? >>> mysqli_stmt_execute($row1); $row2 = mysqli_stmt_get_result($row1);
  • @BrokenArrow 他想要一个流控制,这样他就可以在 e 或其他上显示
  • @nbk 有点意思。那么,不能通过 LIMIT 子句获取两行以通过单次执行来实现相同的目的吗?

标签: php mysql sql loops


【解决方案1】:

应该这样做;

SELECT          T.*, 
                IF(T.parent IS NULL, T.mid, T.parent) AS ParentGroup
FROM            mytable as T
WHERE           T.org = 1 # Comment out here to get for all org
ORDER BY        T.org ASC, ParentGroup ASC, T.parent IS NULL DESC, T.mid ASC

注意:在您的代码中使用 SQL 语句之前,请仔细阅读 SQL 注入策略。

我希望您已经知道如何使用 PHP 从 MySQL 获取数据;获取所有记录后,您可以像下面这样循环;

... Here you already fetched all the records from database into $Recordset array

foreach($Recordset as $Data){ // Loop through the record set
    if($Data["parent"]){
        print "<li>{$Data["item"]}</li>"; // Item
    }
    else{
        print "<div class=\"Category\"><h1>{$Data["item"]}</h1><ul class=\"Item\">"; // Category
    }
}

print "</ul></div>";

【讨论】:

  • php循环怎么样?
  • 您首先获取所有行,对于“组织”,然后循环遍历记录;使用 IF 块检查这是否是一个类别 'if($Row["parent"])',BOLD 它,否则它是一个项目,常规文本 :)
  • 现在应该会生成您所说的 DESIRED 的确切副本
  • 谢谢,但我不确定...类别 div 应该封装所有单个项目
  • 那是 HTML/CSS 部分,你想要 SQL 解决方案,一旦你有你想要的数据,你可以按照你想要的方式排列/显示它!
【解决方案2】:

为您的代码添加流控制

<?php 
$org = "1";

$row1 = mysqli_prepare($mysqli,"SELECT * FROM menu WHERE org = ? ORDER BY mid ASC"); 
$row1->bind_param("s", $org);
mysqli_stmt_execute($row1); 
$row2 = mysqli_stmt_get_result($row1);
$controlfirst = 0;
while(  $row = mysqli_fetch_array($row2)) {
    if ( !isset($row["parent"])) { 
        if ( $controlfirst == 1) {  ?>          
        </div> 
    <?php } ?>
        <div class="category"><?php echo $row["item"]; /* GROUPED*/ 
     $controlfirst = 1;
    }
    else { 
            ?>
            
            <div class="item"><?php echo $row["item"];?> </div>/* INDIVIDUAL ITEM*/
    <?php  }
 }      
if ( $controlfirst == 1) {  ?>      


    </div> 
<?php } ?>

example

【讨论】:

  • 谢谢,但无法正常工作。您能否检查我编辑的问题 - 所需的 HTML 输出代码。顶级类别 div 应该封装所有底层项目。
  • 是的,我已经稍微修改了代码以更好地适应
  • 嗯,我看到第一个类别效果很好,但是第二个和第 n 个类别没有结尾
  • 是的,我也注意到了,但这是一个小调整
  • 你的查询有点不对,但是 php 代码应该是这样的,phpize.online/… 但下次再问一个新问题
  • 猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多