如何使用PHP限制数据库中html表中每行的单元格数量

时间:2019-06-23 13:25:46

标签: php mysql html-table

我正在尝试为我的网站建立一个电子商务商店。我计划将其分为三类(这部分已经在工作),然后将MySQL数据库中的项目列出到表中。

我已经熟悉如何使用MySQL LIMIT函数限制结果,但是我希望它列出数据库中与类别匹配的所有项目与表格,并将其限制为每行最多三个项目。 / p>

i.e.

Table

Item1 Item2 Item3

Item4 Item5 Item6

Item7 etc. etc.

由于每个类别列出的物品数量很少,因此不需要分页。

我什至会开始尝试通过while循环正确地进行设置?我看到了有关PHP的slice函数的信息,但不确定是否能满足我的需求。

我的base while循环可以按预期工作,但是我不确定从哪里开始将循环分成表中的不同行。我做了一个google搜索,发现的大部分与切片有关,但与MySQL fetch array函数无关。

$sql = $db->query('SELECT * FROM store_items WHERE store_cat = "Apparel"');
    if(is_object($sql) && $sql->num_rows > 0)
    {
        while($row = $result->fetch_array())
        {           
            echo '<tr>';
            echo '<td height="250">';
            echo '<img src="" alt="" height="180" /><br />'.$row['store_name'];
            echo '<br /><br />\$'.$row['store_price'].'<br />'.$row['store_desc'];
            echo '<br /><href="">Add to Cart</a>';
            echo '</td>';
            echo '</tr>';
        }
    }

我希望while循环从数据库中以每行3条的行输出数据。现在,除非我为每一行(以及一样多的while循环)运行不同的查询,否则它仅输出1行数据。

4 个答案:

答案 0 :(得分:1)

$row = fetch();
while($row) {
  echo '<tr>';
  for($i = 0; $i < 3; ++$i) {
    echo '<td>';
    if ($row) {
       //print the card here
       //then fetch next row
       $row = fetch();
    } else {
       //nothing needs be done here, since you are just generating empty td tags 
       //to keep the table aligned - same number of columns in all rows. 
       //but you can place here something too.
    }
    echo '</td>';

  }
  echo '</tr>';
}

答案 1 :(得分:1)

您要显示带有图像的项目。尝试CSS Grid进行显示。这样,您将可以更好地控制其关于不同屏幕尺寸的布局。 我在这里使用bootstrap grids,如果需要,可以使用其他名称。

$sql = $db->query('SELECT * FROM store_items WHERE store_cat = "Apparel"');
    if(is_object($sql) && $sql->num_rows > 0)
    {
        echo '<div class="row">'; //Bootstrap Row 

        while($row = $result->fetch_array())
        {           

            echo "<div class= 'col-md-4'>"; //Bootstrap Column
            echo '<img src="" alt="" height="180" /><br />'.$row['store_name'];
            echo '<br /><br />\$'.$row['store_price'].'<br />'.$row['store_desc'];
            echo '<br /><href="">Add to Cart</a>';
            echo '</div>';

        }
         echo '</div>';
    }

在上面的代码中,我们将可用宽度分为三个相等的部分。
仅仅是样式问题,您的代码就可以了。如果只想实现此目的,请避免使用不必要的代码或逻辑,这些代码或逻辑只会降低性能。
这样,您将有更多选择,可以在其下方设置图像和标签的样式。还有其他bootstrap classes for image thumbnails

答案 2 :(得分:0)

为此,我强烈建议使用CSS网格。这样,您可以在CSS中指定每行的项目数,而不必担心适当放置tr标签。每次我需要使用CSS网格时,我都必须搜索它,而且我在移动设备上,所以我没有示例。

但是使用您当前的设置,您可以执行以下操作:

$count=0;
echo '<tr>';
while(...){ 
    $count++;
    //your other code
    if ($count%3===0)echo '</tr><tr>';
}
echo '</tr>';

按照我目前的说法,如果有3的倍数的项目,您可能会在结尾处有一个空行。但是我现在可以移动了,所以我留给您。

答案 3 :(得分:0)

您可以在下面尝试。定义一个变量并检查模数(%),然后相应地打印tr打开/关闭。有关更多详细信息,请参见下面的代码中的注释。

$sql = $db->query('SELECT * FROM store_items WHERE store_cat = "Apparel"');
if(is_object($sql) && $sql->num_rows > 0)
{
    $index = 0; // Define variable for store the indexes 
    while($row = $result->fetch_array())
    {
        if($index % 3 == 0) echo '<tr>'; // Check modulus (%) of $index. Open tr if the modulus is 0
        echo '<td height="250">';
        echo '<img src="" alt="" height="180" /><br />'.$row['store_name'];
        echo '<br /><br />\$'.$row['store_price'].'<br />'.$row['store_desc'];
        echo '<br /><href="">Add to Cart</a>';
        echo '</td>';
        $index++; // Increment the value of $index
        if($index % 3 == 0) echo '</tr>'; // Check modulus (%) of $index. Close tr if the modulus is 0
    }
}

如果您要打印4列,则只需将检查if($index % 3 == 0)更改为if($index % 4 == 0)