【问题标题】:Getting HTML table to display in one row让 HTML 表格在一行中显示
【发布时间】:2020-01-28 03:12:42
【问题描述】:

目前我有这个,

这是我的代码

 <table class="table table-hover">
  <thead>
    <tr>
      <th scope="col">Monday</th>
      <th scope="col">Tuesday</th>
      <th scope="col">Wednesday</th>
      <th scope="col">Thursday</th>
      <th scope="col">Friday</th>
      <th scope="col">Saturday</th>
      <th scope="col">Sunday</th>
    </tr>
  </thead>
  <tbody>

<?php     
      if(isset($_GET['class_id'])) {
        $class_id = $_GET['class_id'];

            } else {
              $class_id = '1'; //default class id => Yoga
            }

       $mQuery = "SELECT * FROM timetable where class_id = '".$class_id."'"; //code to select from database

        $result = $pdo-> query($mQuery); 

        while($row = $result->fetch(PDO::FETCH_ASSOC)):

            $timeslot = $row['timeslot'];
            // pass delimiter and string to explode function
            $timeslot_ar = explode(',', $timeslot);


      ?>        

    //code to display result in table
    <tr class="table-active">
        <?php if(date('l', strtotime($row['date'])) == 'Monday') { ?>
           <td><?= date('d M', strtotime($row['date'])); ?><br/><?= implode("<br/>", $timeslot_ar); ?></td>

           <?php }else { ?>
           <td></td>
        <?php } ?>

        <?php if(date('l', strtotime($row['date'])) == 'Tuesday') { ?>
           <td><?= date('d M', strtotime($row['date'])); ?><br/><?= implode("<br/>", $timeslot_ar); ?></td>
           <?php }else { ?>
           <td></td>
        <?php } ?>

        <?php if(date('l', strtotime($row['date'])) == 'Wednesday') { ?>
           <td><?= date('d M', strtotime($row['date'])); ?><br/><?= implode("<br/>", $timeslot_ar); ?></td>
           <?php }else { ?>
           <td></td>
        <?php } ?>

        <?php if(date('l', strtotime($row['date'])) == 'Thursday') { ?>
           <td><?= date('d M', strtotime($row['date'])); ?><br/><?= implode("<br/>", $timeslot_ar); ?></td>
           <?php }else { ?>
           <td></td>
        <?php } ?>

        <?php if(date('l', strtotime($row['date'])) == 'Friday') { ?>
           <td><?= date('d M', strtotime($row['date'])); ?><br/><?= implode("<br/>", $timeslot_ar); ?></td>
           <?php }else { ?>
           <td></td>
        <?php } ?>

        <?php if(date('l', strtotime($row['date'])) == 'Saturday') { ?>
           <td><?= date('d M', strtotime($row['date'])); ?><br/><?= implode("<br/>", $timeslot_ar); ?></td>
           <?php }else { ?>
           <td></td>
        <?php } ?>

        <?php if(date('l', strtotime($row['date'])) == 'Sunday') { ?>
           <td><?= date('d M', strtotime($row['date'])); ?><br/><?= implode("<br/>", $timeslot_ar); ?></td>
           <?php }else { ?>
           <td></td>
        <?php } ?>
    </tr>
<?php endwhile; ?> 
  </tbody>
</table> 

我一直试图让我的结果在所有天中显示在一行中,然后在已经存在同名的一天时创建一个新行。我一直在试图弄清楚这背后的登录,在无数的堆栈溢出答案和 youtube 教程之后,我到了这一点。我仍然无法将它们排成一行,如果有人愿意解释这背后的方法,我将不胜感激。

【问题讨论】:

  • 如果你想让它们在一行中,那么你需要在 中而不是在 中运行 while 循环。
  • 不禁想知道这段代码是否可以更简洁地表达。
  • 警告:您的代码容易受到 SQL 注入攻击。您应该使用参数化查询和准备好的语句来帮助防止攻击者通过使用恶意输入值来破坏您的数据库。 bobby-tables.com 给出了风险解释,以及一些如何使用 PHP / mysqli 安全地编写查询的示例。 切勿将未经处理的数据直接插入您的 SQL 中。按照您现在编写代码的方式,有人可以轻松窃取、错误更改甚至删除您的数据。
  • 你必须在while中写td,但你在while中写tr,然后php打印tr
  • 您迫切需要阅读for 循环以减少此代码中荒谬的重复数量。几天的数组会使此代码崩溃 7 倍

标签: php html mysql html-table


【解决方案1】:

&lt;tr&gt;&lt;/tr&gt; 放在while() 循环之外:

<tr class="table-active">
<?php     
  // other code

    while($row = $result->fetch(PDO::FETCH_ASSOC)):
        //code for table cells
?>
</tr>

【讨论】:

  • 仅当有 7 天的结果时。
【解决方案2】:

我将假设时间表在查询中按日期顺序输出。您可能应该包含一个ORDER BY 子句来确保这一点。我还假设结果可能超过一周。最后,我将假设每一天都由结果中的一行表示。如果不是这种情况,请展示一个结果样本来证明现实(因为您需要一些额外的逻辑来处理缺失的日期)。

使用这些假设,您似乎只需要在当天是星期一时开始一个新行,并在星期天时结束它。所以...将行创建移到 if 内用于周一,将结尾移到 if 内用于周日,例如:

<?php if(date('l', strtotime($row['date'])) == 'Monday') { ?>
   <tr class="table-active">
...
<?php if(date('l', strtotime($row['date'])) == 'Sunday') { ?>
  </tr>
...

另外,看起来您实际上每天都输出完全相同的&lt;td&gt;,如果不是提到的那一天,您不想输出空白 tds(因为这会添加您不需要的额外单元格)行),所以整个循环可以简化如下:

while($row = $result->fetch(PDO::FETCH_ASSOC)):
    $timeslot = $row['timeslot'];
    // pass delimiter and string to explode function
    $timeslot_ar = explode(',', $timeslot);
?>        

    //code to display result in table
    <?php if(date('l', strtotime($row['date'])) == 'Monday') { ?>
      <tr class="table-active">
    <?php } ?>

       <td><?= date('d M', strtotime($row['date'])); ?><br/><?= implode("<br/>", $timeslot_ar); ?></td>

    <?php if(date('l', strtotime($row['date'])) == 'Sunday') { ?>
      </tr>
    <?php } ?>
<?php endwhile; ?> 

您还可以用简单的字符串替换函数替换 implode/explode...我将把它留给读者作为练习。

【讨论】:

  • 谢谢,但是这个方法也不管用。这些列最终混合成一列(星期一),而不是被分类到各自的表头
  • 我猜当时我的一个假设是错误的。您能否按照我的要求显示(相关样本)源数据,以防万一不是我必须假设的那样?我猜有些日子不见了,也许。如果你想要准确的解决方案,你需要充分解释源数据。
【解决方案3】:

设法通过从桌子上刮下来并使用自定义 div 容器来解决我的问题。

代码sn-p:

<div class="card" style="width: 9rem;display:inline-block">
  <ul class="list-group list-group-flush">
      <center><li class="list-group-item"><b>Monday</b></li></center>
 <?php             
    $sql = "SELECT * FROM timetable where class_id='$class_id' and day='Monday'";
    $stm = $pdo->query($sql);
    $slots = $stm->fetchAll();
    foreach ($slots as $row) {
        $timeslot = $row['timeslot'];
        // pass delimiter and string to explode function
        $timeslot_ar = explode(',', $timeslot);
        echo '<center>'.date('d M', strtotime($row['date'])).'</center>'.'<li class="list-group-item">'.implode("<br/>", $timeslot_ar). '</li>';
    }
    echo "<br/>";   
?>
  </ul>
</div>

最终产品

【讨论】:

  • 修复注射孔! $stmt = $pdo-&gt;prepare("SELECT * FROM timetable where class_id=:class_id and day=:day")(不需要;)然后$stmt-&gt;execute([ 'class_id' =&gt; $class_id, 'day' =&gt; 'Monday') 这并不难,而且可以让你免于遭受你不想伤害自己的整个世界的伤害。
  • &lt;center&gt; 已过时:developer.mozilla.org/en-US/docs/Web/HTML/Element/center。改用 CSS。
猜你喜欢
相关资源
最近更新 更多
热门标签