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

PHP实现从MySQL数据库生成HTML表格的通用函数

解决MySQL生成HTML表格时字段重复输出的问题

你的问题根源是PDO默认的结果集返回模式——默认情况下,查询返回的每一行数据是关联数组+索引数组的混合形式(对应PDO::FETCH_BOTH模式),所以内层foreach($data as $vars)会遍历两次同一个字段值(一次是关联键,一次是索引键),导致每个字段输出两次。

基础修正版

直接设置结果集只返回关联数组,就能解决重复输出问题:

function table_generator($nameTable, $db) {
    // 过滤表名中的非法字符,降低SQL注入风险
    $safeTable = preg_replace('/[^a-zA-Z0-9_]/', '', $nameTable);
    
    $requete = $db->prepare("SELECT * FROM " . $safeTable);
    $requete->execute();
    // 指定只返回关联数组,避免双重遍历
    $requete->setFetchMode(PDO::FETCH_ASSOC);

    foreach($requete AS $data) {
        echo "<tr>";
        foreach($data as $vars){
            echo "<td>$vars</td>";
        }
        echo "</tr>";
    }
}

优化增强版(带表头+安全防护)

如果要让表格更实用,建议加上表头,同时对输出内容做转义防止XSS:

function table_generator($nameTable, $db) {
    $safeTable = preg_replace('/[^a-zA-Z0-9_]/', '', $nameTable);
    
    $requete = $db->prepare("SELECT * FROM " . $safeTable);
    $requete->execute();
    $requete->setFetchMode(PDO::FETCH_ASSOC);
    
    // 获取表头字段名
    $firstRow = $requete->fetch();
    if (!$firstRow) {
        echo "<p>该表无数据</p>";
        return;
    }
    $columns = array_keys($firstRow);
    $requete->execute(); // 重置查询指针,重新获取所有数据

    // 输出完整表格结构
    echo "<table border='1'>";
    // 表头行
    echo "<tr>";
    foreach($columns as $col) {
        echo "<th>" . htmlspecialchars($col) . "</th>";
    }
    echo "</tr>";

    // 数据行
    foreach($requete AS $data) {
        echo "<tr>";
        foreach($data as $vars){
            // 转义HTML特殊字符,避免XSS攻击
            echo "<td>" . htmlspecialchars($vars) . "</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
}

关键优化点

  • 表名过滤:用正则剔除非法字符,避免恶意表名导致的SQL注入(因为PDO无法对表名做参数绑定)
  • 明确fetch模式:强制返回关联数组,彻底解决重复遍历问题
  • HTML转义:用htmlspecialchars()处理输出内容,防止用户输入的特殊字符破坏页面结构或触发XSS
  • 空数据处理:当表中无数据时给出提示,提升用户体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:54:13