如何在 TCPDF 中正确显示反序列化后的数组所有元素

发布时间 - 2026-01-08 00:00:00    点击率:

tcpdf 中无法显示反序列化数组全部内容,是因为 `writehtml()` 被错误地置于循环外部,导致仅最后一次赋值的 `$f` 被渲染;将 `writehtml()` 移入 `foreach` 循环内部即可逐项输出全部数据。

在使用 TCPDF 生成 PDF 报表时,若需展示从 MySQL 数据库中读取并反序列化的 PHP 数组(如 serialize() 存储的 fine_type 字段),常见误区是:将 writeHTML() 调用放在 foreach 循环之外,从而覆盖变量、仅保留最后一个值。

你原始代码的问题核心在于:

foreach ($fine_typesR as $fine_typet) { 
    $f = $fine_typet;    // ✅ 每次赋值,但未立即输出
}
$pdf->writeHTML($f, true, false, false, false, ''); // ❌ 只执行一次,且 $f 是最后一次循环的值

这导致无论数组含 2 个还是 10 个元素,最终仅显示最后一个 $fine_typet。

✅ 正确做法是:在循环体内直接调用 writeHTML(),确保每个元素独立写入 PDF:

$query1 = "SELECT * FROM fine_controls WHERE formid = ?";
$stmt = mysqli_prepare($link, $query1);
mysqli_stmt_bind_param($stmt, 's', $emp_id);
mysqli_stmt_execute($stmt);
$resulty = mysqli_stmt_get_result($stmt);

while ($row22 = mysqli_fetch_assoc($resulty)) {
    $fine_typesR = @unserialize($row22['fine_type']);

    // 安全检查:确保反序列化成功且为数组
    if (is_array($fine_typesR)) {
        foreach ($fine_typesR as $fine_typet) {
            // 可选:添加换行或分隔符提升可读性
            $content = htmlspecialchars((string)$fine_typet, ENT_QUOTES, 'UTF-8');
            $pdf->writeHTML("{$content}", true, false, false, false, '');
        }
    } else {
        $pdf->writeHTML('[Invalid or empty fine_type data]', true, false, false, false, '');
    }
}

// 注意:无需额外 writeHTML 调用 —— 所有内容已在循环中完成输出

? 关键改进点说明:

  • writeHTML() 置于 foreach 内部:保证每个数组元素都被独立写入 PDF 流;
  • 使用预处理语句(mysqli_prepare):避免 SQL 注入风险(原代码中 $emp_id 直接拼接存在严重安全隐患);
  • 增加反序列化安全校验:@unserialize() 加 is_array() 判断,防止因损坏数据或 false 返回导致逻辑异常;
  • HTML 转义输出内容:htmlspecialchars() 防止 XSS 或格式错乱(TCPDF 解析 HTML 时对特殊字符敏感);
  • 结构化输出:用 包裹每项,便于后续 CSS 样式控制(如添加间距、边框等)。

    ⚠️ 注意事项:

    • TCPDF 的 writeHTML() 默认以块级方式渲染,连续调用会自动换行;如需横向排列(如逗号分隔),可改用 $pdf->writeHTMLCell() 或拼接字符串后单次输出;
    • 若 fine_type 字段存储的是关联数组或嵌套结构,请先 array_values() 提取索引值,或遍历键值对明确输出格式;
    • 始终验证数据库字段是否确实包含有效序列化字符串(可用 var_dump($row22['fine_type']) 调试)。

    通过以上调整,即可稳定、安全、完整地在 TCPDF 生成的 PDF 中呈现反序列化数组的所有条目。


# mysql  # php  # css  # html  # pdf  # 键值对  # 排列  # lsp  # sql  # xss  # 关联数组  # foreach  # 字符串  # 循环  # 数据库  # 序列化  # 的是  # 换行  # 是因为  # 放在  # 遍历  # 请先  # 已在  # 可选  # 如需 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: js实现点击每个li节点,都弹出其文本值及修改  Android中AutoCompleteTextView自动提示  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  浅述节点的创建及常见功能的实现  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel如何处理文件下载请求?(Response示例)  如何在服务器上配置二级域名建站?  如何注册花生壳免费域名并搭建个人网站?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  EditPlus中的正则表达式 实战(4)  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  焦点电影公司作品,电影焦点结局是什么?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  iOS验证手机号的正则表达式  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  javascript中闭包概念与用法深入理解  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何用AI帮你把自己的生活经历写成一个有趣的故事?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  Laravel怎么实现验证码(Captcha)功能  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  如何破解联通资金短缺导致的基站建设难题?  Python进程池调度策略_任务分发说明【指导】  Laravel如何实现模型的全局作用域?(Global Scope示例)  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  如何快速打造个性化非模板自助建站?  5种Android数据存储方式汇总  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何使用Blade模板引擎?(完整语法和示例)  如何打造高效商业网站?建站目的决定转化率  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  网站图片在线制作软件,怎么在图片上做链接?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  免费视频制作网站,更新又快又好的免费电影网站?  简单实现Android验证码  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何快速搭建FTP站点实现文件共享?  Android仿QQ列表左滑删除操作  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  详解Android中Activity的四大启动模式实验简述  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程