: Table Data Cell / 表格中的一个单元格。 以 “需求(1): 能够直观的呈现各省由近到远(日期)的每日积分抵现合计金额” 为例, 构建 Web 表格。 效果如下: ↓ \downarrow ↓ 附 HTML 代码: XX集团各省由近到远(日期)的每日积分抵现合计金额省 | 10月06日 | 10月05日 | 10月04日 | 10月03日 | 10月02日 | 10月01日 | 09月30日 | 09月29日 | 总计 |
---|
四川 | 111831 | 91333 | 84645 | 85928 | 119526 | 169005 | 143583 | 297034 | 1102885 | 西安 | 273485 | 162851 | 119523 | 170458 | 174650 | 225007 | 247525 | 572872 | 1946371 | 云南 | 229005 | 150066 | 139779 | 146863 | 174553 | 296661 | 217093 | 398506 | 1752526 | 总计 | 614321 | 404250 | 343947 | 403249 | 468729 | 690673 | 608201 | 1268412 | 4801782 | 动态生成 HTML 标记语言 - 实时调取数据库数据 (以 PHP 脚本为例) 这里为了方便演示, 使用了简单的 PHP语言 实现, 使用 ASP语言, Java, JavaScript脚本语言, Python 的 Django Web框架 等, 都可实现同样效果。 以 “需求(2): 能够直观的呈现各省由近到远(日期)的每日积分抵现平均金额” 为例, 动态生成 HTML 标记语言, 构建 Web 表格。 需要注意的是, 在实现 需求(2) 的时候, 各省份最右边行尾的 各省总体平均值 不能简单的将该行的数据平均, 因为 先按日期分组平均再加总平均 与 直接按省份总体平均 的结果会有差异, 因为每组数据的数量不一样, 需要先在数据库计算好。 效果如下: ↓ \downarrow ↓ 附 需求(2) 在 index.php 中 PHP 的函数调用代码: XX集团各省由近到远(日期)的每日积分抵现平均金额/* 通过 PDO 初始化 MySQL 连接 */ $pdo = Func_Init_MySQL_Connect_by_PDO($Arg_Host="127.0.0.1", $Arg_UserName="goufeng"); /* 将 "按省平均" 的数据查询出来, 并保存在 数组(Array) 中 */ $sql__sc_avg = "SELECT DISTINCT 按省冲抵金额平均 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '四川'"; $sql__xa_avg = "SELECT DISTINCT 按省冲抵金额平均 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '西安'"; $sql__yn_avg = "SELECT DISTINCT 按省冲抵金额平均 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '云南'"; $sql_all_avg = "SELECT AVG(冲抵金额) FROM view_xxgroup_2023_zq_gq_points_deduction;"; $arr__sc_avg = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql__sc_avg ); $arr__xa_avg = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql__xa_avg ); $arr__yn_avg = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql__yn_avg ); $arr_all_avg = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql_all_avg ); /* 调用 PHP 函数, 构建 表格表头(Table Header) */ $sql = "SELECT DISTINCT 月日 FROM report_xxgroup_2023_zq_gq_points_deduction"; $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Header($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="省", $Arg_DIY_Tail_of_Row="平均"); /* 调用 PHP 函数, 构建 表格行(Table Row) */ $sql = "SELECT 明细冲抵金额平均 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '四川'"; $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Row($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="四川", $Arg_DIY_Tail_of_Row=$arr__sc_avg[0]); // "按省平均" 的数据放在行尾。 /* 调用 PHP 函数, 构建 表格行(Table Row) */ $sql = "SELECT 明细冲抵金额平均 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '西安'"; $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Row($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="西安", $Arg_DIY_Tail_of_Row=$arr__xa_avg[0]); // "按省平均" 的数据放在行尾。 /* 调用 PHP 函数, 构建 表格行(Table Row) */ $sql = "SELECT 明细冲抵金额平均 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '云南'"; $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Row($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="云南", $Arg_DIY_Tail_of_Row=$arr__yn_avg[0]); // "按省平均" 的数据放在行尾。 /* 调用 PHP 函数, 构建 表格总结行(Table Summary Row) */ $sql = "SELECT 按日冲抵金额平均 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '四川'"; // 随便指定一个省, 因为数据库聚合数据是左连接指定的。 $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Header($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="平均", $Arg_DIY_Tail_of_Row=$arr_all_avg[0]); // "按省平均" 的数据放在行尾。 ?> 以 “需求(3): 能够直观的呈现各省由近到远(日期)的每日积分抵现增长幅度” 为例, 动态生成 HTML 标记语言, 构建 Web 表格。 效果如下: ↓ \downarrow ↓ 附 需求(3) 在 index.php 中 PHP 的函数调用代码: XX集团各省由近到远(日期)的每日积分抵现增长幅度/* 调用 PHP 函数, 构建 表格表头(Table Header) */ $sql = "SELECT DISTINCT 月日 FROM report_xxgroup_2023_zq_gq_points_deduction"; $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Header($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="省", $Arg_DIY_Tail_of_Row="合计增长"); /* 调用 PHP 函数, 构建 表格行(Table Row) */ $sql = "SELECT 明细增长幅度 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '四川'"; $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Row($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="四川", $Arg_DIY_Tail_of_Row="SUM"); // 调用函数内的 "求和(Sum)" 功能。 /* 调用 PHP 函数, 构建 表格行(Table Row) */ $sql = "SELECT 明细增长幅度 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '西安'"; $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Row($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="西安", $Arg_DIY_Tail_of_Row="SUM"); // 调用函数内的 "求和(Sum)" 功能。 /* 调用 PHP 函数, 构建 表格行(Table Row) */ $sql = "SELECT 明细增长幅度 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '云南'"; $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Row($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="云南", $Arg_DIY_Tail_of_Row="SUM"); // 调用函数内的 "求和(Sum)" 功能。 /* 调用 PHP 函数, 构建 表格总结行(Table Summary Row) */ $sql = "SELECT 按日增长幅度 FROM report_xxgroup_2023_zq_gq_points_deduction WHERE 省 = '四川'"; // 随便指定一个省, 因为数据库聚合数据是左连接指定的。 $arr = Func_Exec_MySQL_Select_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO=$pdo, $Arg_SQL_SELECT_Stmt=$sql); Func_Read_1D_Array_to_HTML_Table_Header($Arg_1D_Array=$arr, $Arg_DIY_Head_of_Row="总计", $Arg_DIY_Tail_of_Row="SUM"); // 调用函数内的 "求和(Sum)" 功能。 ?> 附 PHP 连接 MySQL 函数定义代码 (PDO 函数): /* * Create By GF 2024-03-29 */ /* 初始化 MySQL 连接函数 - 通过 PDO 初始化 MySQL 连接 */ function Func_Init_MySQL_Connect_by_PDO($Arg_Host="127.0.0.1", $Arg_UserName="anonymous", $Arg_Password="12345678", $Arg_Database="gf_demo") { /* * PDO 连接关闭方法 1. 设置 PDO 连接的 PDO::ATTR_PERSISTENT 属性为 false。 * 在 PDO 的构造函数中, 可以设置第四个参数为 false 来关闭连接。 * 例如, $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password', array(PDO::ATTR_PERSISTENT => false));。 * * PDO 连接关闭方法 2. 使用 null 来关闭 PDO 连接。 * 可以将 PDO 对象设置为 null 来关闭连接。 * 例如, $pdo = null;, 这会释放连接资源, 并确保数据库连接在不需要时不会一直占用系统资源。 * * 当脚本执行完成或调用了 exit() 函数时, PDO 会自动关闭数据库连接。在大多数情况下, 不需要显式地关闭连接。 */ $Inr_Host = $Arg_Host; $Inr_UserName = $Arg_UserName; $Inr_Password = $Arg_Password; $Inr_Database = $Arg_Database; try { /* -------------------------------------- */ /* 创建 mysql_connect 数据库连接 */ $dsn = "mysql:host=".$Inr_Host.";port=3306;charset=utf8;dbname=".$Inr_Database; /* ...................................... */ $pdo = new PDO($dsn, $Inr_UserName, $Inr_Password); /* ...................................... */ return $pdo; } catch (PDOException $e) { /* -------------------------------------- */ /* MySQL 连接失败时显示错误信息 */ die ("Database Connection Error: ".$e->getMessage()." "); } } /* 执行 MySQL SELECT 语句函数 - 通过 PDO 提取单个字段到 1 维 数组(Array) */ function Func_Exec_MySQL_SELECT_Stmt_Extract_Field_to_1D_Array_by_PDO($Arg_PDO, $Arg_SQL_SELECT_Stmt) { $Inr_PDO = $Arg_PDO; /* .......................................... */ /* 从 参数(Arguments) 传递 SQL 的 SELECT 语句 */ $Inr_SQL_Statements = $Arg_SQL_SELECT_Stmt; /* ------------------------------------------ */ /* 验证 SQL 的 SELECT 语句是否只包含 1 个字段 */ preg_match("/SELECT .* FROM/i", $Inr_SQL_Statements, $matches); /* .......................................... */ $Part_SELECT_of_SQL_Stmt = $matches[0]; /* .......................................... */ $Part_SELECT_of_SQL_Stmt = str_ireplace(array("SELECT ", "SELECT DISTINCT ", " FROM"), "", $Part_SELECT_of_SQL_Stmt); /* .......................................... */ $Part_SELECT_of_SQL_Stmt = preg_split("/,/i", $Part_SELECT_of_SQL_Stmt); /* .......................................... */ if (count($Part_SELECT_of_SQL_Stmt) > 1) { /* 如果 SQL 的 SELECT 语句包含多个字段, 则终止函数运行 */ echo "[Caution] Function ( Func_Exec_MySQL_SELECT_Stmt_Extract_Field_to_1D_Array_by_PDO ) Running Error: SQL SELECT Statement Contains Multiple Fields."; exit(); } /* ------------------------------------------ */ try { /* -------------------------------------- */ /* 查询(SELECT) 语句执行成功后提取数据到数组(Array) */ $Rtn_Array = array(); /* -------------------------------------- */ /* 执行查询语句 */ $Result = $Inr_PDO->query($Inr_SQL_Statements); /* ...................................... */ /* 返回值是一个嵌套数组, 每一行为一个数组 (键为行号, 值为行的数组), 每一行里面又包含每个 "字段=>值" 的数组 (键为字段,值为字段的值) */ $Data = $Result->fetchAll(PDO::FETCH_ASSOC); /* ...................................... */ foreach ($Data as $Num => $Line) { //echo "This is The ".$Num." Line."; foreach ($Line as $Field => $Value) { /* * PHP 数组(Array) 添加元素示例: * $array = array(1, 2, 3); // -> 声明 数组(Array) 并赋值 1, 2, 3。 * array_push($array, 4); // -> 向 数组(Array) 添加单个元素。 * array_push($array, 5, 6); // -> 向 数组(Array) 添加多个元素。 * $array[] = 4; // -> 将 4 添加到 数组(Array) 末尾。 * $array[0] = 0; // -> 将 0 添加到 数组(Array) 指定下标位置。 * $newArray = array(4); // -> 声明一个新的 数组(Array) 并赋值 4。 * $array = array_merge($array, $newArray); // -> 使用 array_merge() 函数将包含新元素的 数组(Array) 合并到原 数组(Array) 末尾。 * array_splice($array, 1, 0, $newArray); // -> 使用 array_splice() 函数将包含新元素的 数组(Array) 插入到指定下标位置。 */ array_push($Rtn_Array, $Value); } } /* ...................................... */ return $Rtn_Array; } catch (PDOException $e) { /* MySQL 查询失败时显示错误信息 */ die ("[Caution] Database Query Error: ".$e->getMessage()." "); } } 附 PHP 输出 表格行(Table Row) 函数定义代码: /* * Create By GF 2024-03-29 */ /* 数组(Array) 操作函数 - 对 1D Array 中的数字求和 */ function Func_Numeric_in_1D_Array_Sum($Arg_1D_Array) { $Inr_1D_Array = $Arg_1D_Array; /* ------------------------------------------ */ /* 获取 1 维 数组(Array) 的长度 */ $Inr_1D_Array_Length = count($Inr_1D_Array); /* ------------------------------------------ */ if ($Inr_1D_Array_Length == 0) { return NULL; } else { $Calc_Sum = 0; /* -------------------------------------- */ for($i=0; $i < $Inr_1D_Array_Length; $i++) if (is_numeric($Inr_1D_Array[$i]) == true) $Calc_Sum += $Inr_1D_Array[$i]; /* -------------------------------------- */ return $Calc_Sum; } } /* 数组(Array) 操作函数 - 对 1D Array 中的数字求平均 */ function Func_Numeric_in_1D_Array_Avg($Arg_1D_Array) { $Inr_1D_Array = $Arg_1D_Array; /* ------------------------------------------ */ /* 获取 1 维 数组(Array) 的长度 */ $Inr_1D_Array_Length = count($Inr_1D_Array); /* ------------------------------------------ */ if ($Inr_1D_Array_Length == 0) { return NULL; } else { $Calc_Sum = 0; $Calc_Count = 0; /* -------------------------------------- */ for($i=0; $i < $Inr_1D_Array_Length; $i++) { if (is_numeric($Inr_1D_Array[$i]) == true) { $Calc_Sum += $Inr_1D_Array[$i]; $Calc_Count += 1; } } /* -------------------------------------- */ /* 计算平均值: 平均值 = 总和 / 数量 */ $Calc_Avg = $Calc_Sum / $Calc_Count; /* -------------------------------------- */ return $Calc_Avg; } } /* 生成 HTML 函数 - 读取 1D Array 到 HTML 表格表头(Table Header) */ function Func_Read_1D_Array_to_HTML_Table_Header($Arg_1D_Array, $Arg_DIY_Head_of_Row=NULL, $Arg_DIY_Tail_of_Row=NULL, $Arg_Decimal_Places=2) { $Inr_1D_Array = $Arg_1D_Array; /* ------------------------------------------ */ /* 自定义(DIY) 行头(Head of Row) */ if ($Arg_DIY_Head_of_Row != NULL) $Inr_1D_Array = array_merge(array($Arg_DIY_Head_of_Row), $Inr_1D_Array); /* ------------------------------------------ */ /* 自定义(DIY) 行尾(Tail of Row) */ if (strtoupper($Arg_DIY_Tail_of_Row) == "SUM") { array_push($Inr_1D_Array, Func_Numeric_in_1D_Array_Sum($Inr_1D_Array)); } else if (strtoupper($Arg_DIY_Tail_of_Row) == "AVG") { array_push($Inr_1D_Array, Func_Numeric_in_1D_Array_Avg($Inr_1D_Array)); } else if ($Arg_DIY_Tail_of_Row != NULL) { array_push($Inr_1D_Array, $Arg_DIY_Tail_of_Row); } /* ------------------------------------------ */ /* 获取 1 维 数组(Array) 的长度 */ $Inr_1D_Array_Length = count($Inr_1D_Array); /* ------------------------------------------ */ /* 对 数组(Array) 中数字的小数位数进行重置 */ if ($Arg_Decimal_Places != NULL && is_numeric($Arg_Decimal_Places) == true) for($i=0; $i < $Inr_1D_Array_Length; $i++) if (is_numeric($Inr_1D_Array[$i]) == true) $Inr_1D_Array[$i] = sprintf("%.".$Arg_Decimal_Places."f", $Inr_1D_Array[$i]); /* ------------------------------------------ */ /* 判断 1 维 数组(Array) 的长度 (是否有数据) */ if ($Inr_1D_Array_Length < 1) { /* -------------------------------------- */ /* 如果 1 维 数组(Array) 的长度为 0 (没有数据) */ echo " "; echo " ";echo " ";echo " [Caution] Function ( Func_Read_1D_Array_to_HTML_Table_Row ) Value of 1D Array Error: No Data Available. | ";echo " ";echo " "; echo " ";} else { /* -------------------------------------- */ /* 如果 1 维 数组(Array) 的长度大于 0 (有数据) */ echo " |