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 调用 —— 所有内容已在循环中完成输出
? 关键改进点说明:
⚠️ 注意事项:
通过以上调整,即可稳定、安全、完整地在 TCPDF 生成的 PDF 中呈现反序列化数组的所有条目。