PHP Select查询结果重复显示问题:如何消除重复数据并正确渲染表格?
解决SetScrews表查询返回重复数据的问题
问题分析
查询返回重复数据,通常是因为SetScrews表中存在满足DID=$id and MID=$mid and PID=$pid条件的重复记录(非主键字段完全一致),或者查询逻辑未做去重处理。
直接解决方案:添加去重逻辑
方法1:使用DISTINCT关键字
修改SQL语句,指定需要去重的字段(与表格展示字段一致),确保返回的记录唯一:
SELECT DISTINCT DIN, LENGTH, MATERIAL, THREAD, SIZE FROM SetScrews WHERE DID=$id AND MID=$mid AND PID=$pid
方法2:使用GROUP BY分组
通过分组查询实现去重,效果与DISTINCT类似:
SELECT DIN, LENGTH, MATERIAL, THREAD, SIZE FROM SetScrews WHERE DID=$id AND MID=$mid AND PID=$pid GROUP BY DIN, LENGTH, MATERIAL, THREAD, SIZE
关键修复:解决SQL注入漏洞
你的代码直接将POST参数拼接进SQL语句,存在严重的SQL注入风险,必须改用预处理语句。以下是修复去重问题+解决安全漏洞的完整代码:
<?php if ( isset($_POST['id']) && isset($_POST['mid']) && isset($_POST['pid'])) { $id = $_POST['id']; $mid = $_POST['mid']; $pid = $_POST['pid']; $servername = "localhost"; $username = "xxxx"; $password = "xxxx"; $dbname = "xxxx"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 预处理语句:避免SQL注入,同时添加DISTINCT去重 $sql = "SELECT DISTINCT DIN, LENGTH, MATERIAL, THREAD, SIZE FROM SetScrews WHERE DID=? AND MID=? AND PID=?"; $stmt = $conn->prepare($sql); // 绑定参数:"iii"表示三个整数类型参数,若字段为字符串则改为"sss" $stmt->bind_param("iii", $id, $mid, $pid); $stmt->execute(); $result = $stmt->get_result(); if ($result !== false && $result->num_rows > 0) { echo '<table> <tr> <th style="text-align:center; color:white; background-color:#000000;">DIN</th> <th style="text-align:center; color:white; background-color:#000000;">LENGTH</th> <th style="text-align:center; color:white; background-color:#000000;">MATERIAL</th> <th style="text-align:center; color:white; background-color:#000000;">THREAD</th> <th style="text-align:center; color:white; background-color:#000000;">SIZE</th> </tr>'; while($row = $result->fetch_assoc()) { // 用htmlspecialchars转义输出,防止XSS攻击 echo '<tr> <td style="text-align:center; color:black; background-color:#b4c6e7;">' . htmlspecialchars($row['DIN']) . '</td> <td style="text-align:center; color:black; background-color:#b4c6e7;">' . htmlspecialchars($row['LENGTH']) . '</td> <td style="text-align:center; color:black; background-color:#b4c6e7;">' . htmlspecialchars($row['MATERIAL']) . '</td> <td style="text-align:center; color:black; background-color:#b4c6e7;">' . htmlspecialchars($row['THREAD']) . '</td> <td style="text-align:center; color:black; background-color:#b4c6e7;">' . htmlspecialchars($row['SIZE']) . '</td> </tr>'; } echo '</table>'; } else { echo "0 results"; } $stmt->close(); $conn->close(); } ?>
额外建议
如果表中存在不必要的重复数据,建议直接清理重复记录,或者给DIN, LENGTH, MATERIAL, THREAD, SIZE等字段添加联合唯一约束,从源头避免重复数据生成。
内容的提问来源于stack exchange,提问作者Wes
相关产品推荐
相关产品推荐

