You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:35:04