我正在尝试为我的网站建立一个电子商务商店。我计划将其分为三类(这部分已经在工作),然后将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行数据。
答案 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)