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
相关产品推荐
相关产品推荐

