tcpdf 中无法显示反序列化数组的全部元素,是因为 `writehtml()` 被错误地置于循环外部,导致仅最后一次赋值的 `$f` 被输出;将 `writehtml()` 移入 `foreach` 循环内部即可逐条渲染所有数据。
在使用 TCPDF 生成 PDF 报表时,若需展示从数据库中读取并反序列化的数
组(例如 fine_type 字段存储的是 serialize(['3', '7'])),必须注意变量作用域与输出逻辑的匹配。原始代码的问题在于:
while($row22 = mysqli_fetch_assoc($resulty)){
$fine_typesR = unserialize($row22['fine_type']); // 每次覆盖,最终只保留最后一行的反序列化结果
}
foreach ($fine_typesR as $fine_typet) {
$f = $fine_typet; // 仍为逐个赋值,但未及时输出
}
$pdf->writeHTML($f, true, false, false, false, ''); // ❌ 仅输出最后一次的 $f(即最后一个值)该写法存在两个关键缺陷:
✅ 正确做法是:
优化后的安全、健壮示例代码如下:
// ✅ 使用预处理防止 SQL 注入
$stmt = $link->prepare("SELECT fine_type FROM fine_controls WHERE formid = ?");
$stmt->bind_param("s", $emp_id);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
$fine_typesR = @unserialize($row['fine_type']);
// 安全检查:确保反序列化成功且为数组
if (is_array($fine_typesR)) {
foreach ($fine_typesR as $fine_typet) {
// 添加 HTML 格式化(如需换行)
$html = htmlspecialchars($fine_typet, ENT_QUOTES, 'UTF-8');
$pdf->writeHTML("{$html}", true, false, false, false, '');
}
}
}⚠️ 注意事项:
中保证排版一致性;
通过修正循环结构与增强数据校验,即可稳定、完整地在 TCPDF 中呈现反序列化后的全部数组项。