如何在 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队列使用教程

