如何在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"> ₹<?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"> ₹<?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_prepare、mysqli_stmt_bind_param、mysqli_stmt_execute来执行查询,避免直接把用户输入拼到SQL语句中,提升安全性。 - 优化数据库连接:把数据库名直接放到
mysqli_connect的第四个参数中,同时添加连接错误处理,方便排查问题。 - 合法性校验:动态获取分类ID时,检查参数是否存在且为数字,避免非法输入导致的错误。
内容的提问来源于stack exchange,提问作者rashvika




