【问题标题】:problem getting the right outcome with foreach使用 foreach 获得正确结果的问题
【发布时间】:2020-11-09 16:13:33
【问题描述】:

我有以下代码来生成包含已下订单的 HTML 表格。

// Select data FROM ORDER & ORDERLINE
        $id = $value->ID;
        $datenow = date("Y-m-d");
        $temp = 0;
        $stmt2 = $mysql->prepare("SELECT salesorder.order_id AS soid, salesorder.delivery_date AS sdd, orderline.qty AS olq, food.food_type AS fft
                                FROM orderline
                                INNER JOIN salesorder ON salesorder.order_id = orderline.order_id
                                INNER JOIN food ON food.food_id = orderline.food_id
                                WHERE salesorder.client_id=? AND orderline.qty!=?
                                ORDER BY sdd");
        $stmt2->bind_param('ss', $id, $temp);
        $stmt2->execute();
        $result2 = $stmt2->get_result();
        
    // determen if there are orders to display
    if (mysqli_num_rows($result2) > 0) {
        
        while ($value2 = $result2->fetch_object()) {
        $results[] = $value2; 
        }
    ?>

    <table class="center table">
            <thead>
                <tr>
                    <th>Order Number</th>
                    <th>Delivery Date</th>
                    <th>QTY</th>
                    <th>Food Type</th>
                </tr>
            </thead>
            <tbody>
                <b>Delivered orders :</b> (and orders delivered today...)
                <?php foreach ( $results as $result ) : ?>
                <?php if (($result->sdd)<=$datenow) { ?>
                        <td><?php echo ($result->soid); ?></td>
                        <td><?php echo ($result->sdd); ?></td>
                        <td><?php echo ($result->olq); ?></td>
                        <td><?php echo ($result->fft); ?></td>                      
                    </tr>
                <?php } ?>
                <?php endforeach;?>
            </tbody>
        </table>

问题在于“交货日期”和“订单号”的显示次数与数量和食品类型一样多。我知道这与索引有关,但是无论我如何尝试,我都找不到正确的语法或方法。有任何想法吗? 我已将数据表添加为图像。请告诉我...

【问题讨论】:

  • 首先,请停止创建无效的 HTML。您不能像这样直接将b 放入tbody
  • “我知道这与索引有关” - 不,如果有的话,这与 type 无关您正在使用的 JOIN。 INNER JOIN 现在可能是您想要的。
  • 您能否提供 3 个表 orderline、salesorder 和 food 的数据样本?
  • 我插入了一张包含 3 张桌子的图片
  • 您尝试检查哪些问题?为什么不从检查 SQL 查询开始 - 复制它,将其粘贴到 phpMyAdmin 或您使用的任何东西,然后检查返回的数据是否是您期望的数据

标签: php indexing foreach


【解决方案1】:
  1. foreach里面你需要打开&lt;tr&gt;标签
  2. 你可以直接循环数组mysqli_fetch_assoc返回数组,那么为什么要存入$results[]数组,

【讨论】:

  • 对不起我的错误,你使用 fetch_object()、msyqli_fetch_assoc 和 fetch_objec() 返回相同的东西,在你的情况下:fetch_object()) { ?> sdd) soid); ?> sdd); ?> olq); ?> fft); ?>
  • 和上面的注释一样,你可以使用 fetch_object 返回数组,所以你不需要将返回数组推入 $results2 数组,然后在 foreach 上使用之后
  • 感谢 Eibs,确实加倍。但我的实际问题仍然存在,我在结果中看到,订单号和交货日期也重复了 4 次,与我的数量和食物类型一样多。我想要的结果是一个包含订单号、交货日期和 n 多行的表格,其中包含数量和食物类型
  • 您的查询是否根据您的需要在数据库上完美运行?
  • 查询的结果看起来不错,但是它会循环遍历所有内容,并且每一行都给出了订单号、日期、数量和食物类型。我想要的是订单号和日期一次,然后是数量和食物类型,尽可能多
【解决方案2】:

根据您对 Eibs 其他答案的 cmets,您能否检查以下内容是否满足您的需求。首先,当您循环结果时,我们创建一个按订单号和日期分组的关联数组,并将每个项目添加到 items 数组中。然后在创建表时,我们循环结果数组,然后是项目数组。我使用单独的行只是因为您有一个标题行,但是,使用相同的方法您可以设计您的表格输出多种不同的方式。

  // determen if there are orders to display
  if(mysqli_num_rows($result2) > 0)
  {
    while($value2 = $result2->fetch_object())
    {
      $key = $value2->soid.'-'.$value2->sdd;
      if(!isset($results[$key]))
      {
        $results[$key] = array(
            'soid' => $value2->soid,
            'sdd' => $value2->sdd,
            'items' => array(),
        );
      }
      $results[$key]['items'][] = $value2;
    }
  }
  ?>
  <table class="center table">
    <thead>
    <tr>
      <th>Order Number</th>
      <th>Delivery Date</th>
      <th>QTY</th>
      <th>Food Type</th>
    </tr>
    </thead>
    <tbody>
    <tr>
      <td colspan="4"><b>Delivered orders :</b> (and orders delivered today...)</td>
    </tr>
    <?php foreach($results as $result) : ?>
      <?php if($result['sdd'] <= $datenow): ?>
        <tr>
          <td><?php echo($result['soid']); ?></td>
          <td><?php echo($result['sdd']); ?></td>
          <td></td>
          <td></td>
        </tr>
        <?php foreach($result['items'] as $item): ?>
          <tr>
            <td></td>
            <td></td>
            <td><?php echo($item->olq); ?></td>
            <td><?php echo($item->fft); ?></td>
          </tr>
        <?php endforeach; ?>
      <?php endif; ?>
    <?php endforeach; ?>
    </tbody>
  </table>

【讨论】:

  • 嗨,马克。这确实成功了。太感谢了。我知道这是有索引的东西,但我对 PHP 还是很陌生。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2011-12-24
相关资源
最近更新 更多