You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在PHP中仅展示指定分类的商品?

解决方案:仅展示指定分类下的商品

要实现只显示指定分类的商品,我们需要修改SQL查询添加分类过滤条件,同时做好安全处理避免SQL注入。下面分两种常见场景给出修改后的代码:

场景1:固定展示某个分类(比如分类ID为3的商品)

如果是固定展示某个分类,直接在查询中添加WHERE条件即可:

<?php
// 数据库连接(优化写法,包含数据库名并添加错误处理)
$con = mysqli_connect('localhost', 'root', '', 'tims');
if (!$con) {
    die("连接失败: " . mysqli_connect_error());
}

// 指定要展示的分类ID
$targetCategoryId = 3;

// 修改查询语句,添加分类过滤条件
$query = "SELECT * FROM products p JOIN categories c ON p.c_id = c.c_id WHERE c.c_id = ?";

// 使用预处理语句防止SQL注入
$stmt = mysqli_prepare($con, $query);
mysqli_stmt_bind_param($stmt, "i", $targetCategoryId);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

$num = mysqli_num_rows($result);
if ($num > 0) {
    // 输出商品列表
    while($row = mysqli_fetch_array($result)) {
?>
<div class="col-12 col-sm-6 col-md-12 col-xl-6">
<div class="single-product-wrapper">
<!-- Product Image -->
<div class="product-img">
<img src="<?php echo $row['image'] ?>" alt="" />
<img src="<?php echo $row['image2'] ?>" alt="" class="hover-img" />
</div>
<!-- Product Description -->
<div class="product-description d-flex align-items-center justify-content-between">
<!-- Product Meta Data -->
<div class="product-meta-data">
<div class="line"></div>
<p class="product-price">
&#8377;<?php echo $row['price']; ?>
</p>
<a href="product-details.php?action=add&p_id=<?php echo $row['p_id']; ?> ">
<h6>
<?php echo $row['title'] ?>
</h6>
</a>
</div>
<!-- Ratings & Cart -->
<div class="ratings-cart text-right">
<div class="ratings">
<i class="fa fa-star" aria-hidden="true"></i>
<i class="fa fa-star" aria-hidden="true"></i>
<i class="fa fa-star" aria-hidden="true"></i>
<i class="fa fa-star" aria-hidden="true"></i>
</div>
<div class="cart">
<a href="cart.html" name="add-to-cart" data-toggle="tooltip" data-placement="left" title="Add to Cart"><img src="img/core-img/cart.png" alt=""></a>
</div>
</div>
</div>
</div>
</div>
<?php
    }
} else {
    echo "该分类下暂无商品";
}

// 关闭语句和连接
mysqli_stmt_close($stmt);
mysqli_close($con);
?>

场景2:动态从URL获取分类ID(比如通过category.php?cid=2访问)

如果需要根据URL参数动态展示不同分类,我们可以从$_GET获取分类ID,同时做合法性校验:

<?php
// 数据库连接
$con = mysqli_connect('localhost', 'root', '', 'tims');
if (!$con) {
    die("连接失败: " . mysqli_connect_error());
}

// 从URL获取分类ID,默认值可以设为1或者提示错误
if (!isset($_GET['cid']) || !is_numeric($_GET['cid'])) {
    die("请指定有效的分类ID");
}
$targetCategoryId = (int)$_GET['cid'];

// 带分类过滤的预处理查询
$query = "SELECT * FROM products p JOIN categories c ON p.c_id = c.c_id WHERE c.c_id = ?";
$stmt = mysqli_prepare($con, $query);
mysqli_stmt_bind_param($stmt, "i", $targetCategoryId);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

$num = mysqli_num_rows($result);
if ($num > 0) {
    // 输出商品列表(和上面的HTML部分完全一致)
    while($row = mysqli_fetch_array($result)) {
?>
<div class="col-12 col-sm-6 col-md-12 col-xl-6">
<div class="single-product-wrapper">
<!-- Product Image -->
<div class="product-img">
<img src="<?php echo $row['image'] ?>" alt="" />
<img src="<?php echo $row['image2'] ?>" alt="" class="hover-img" />
</div>
<!-- Product Description -->
<div class="product-description d-flex align-items-center justify-content-between">
<!-- Product Meta Data -->
<div class="product-meta-data">
<div class="line"></div>
<p class="product-price">
&#8377;<?php echo $row['price']; ?>
</p>
<a href="product-details.php?action=add&p_id=<?php echo $row['p_id']; ?> ">
<h6>
<?php echo $row['title'] ?>
</h6>
</a>
</div>
<!-- Ratings & Cart -->
<div class="ratings-cart text-right">
<div class="ratings">
<i class="fa fa-star" aria-hidden="true"></i>
<i class="fa fa-star" aria-hidden="true"></i>
<i class="fa fa-star" aria-hidden="true"></i>
<i class="fa fa-star" aria-hidden="true"></i>
</div>
<div class="cart">
<a href="cart.html" name="add-to-cart" data-toggle="tooltip" data-placement="left" title="Add to Cart"><img src="img/core-img/cart.png" alt=""></a>
</div>
</div>
</div>
</div>
</div>
<?php
    }
} else {
    echo "该分类下暂无商品";
}

mysqli_stmt_close($stmt);
mysqli_close($con);
?>

关键修改点说明:

  • 添加分类过滤条件:在JOIN后的查询中加入WHERE c.c_id = ?来筛选指定分类的商品,这里用占位符?是为了防止SQL注入。
  • 使用预处理语句:通过mysqli_preparemysqli_stmt_bind_parammysqli_stmt_execute来执行查询,避免直接把用户输入拼到SQL语句中,提升安全性。
  • 优化数据库连接:把数据库名直接放到mysqli_connect的第四个参数中,同时添加连接错误处理,方便排查问题。
  • 合法性校验:动态获取分类ID时,检查参数是否存在且为数字,避免非法输入导致的错误。

内容的提问来源于stack exchange,提问作者rashvika

火山引擎 最新活动