You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TCPDF表格列数据显示异常求助:双表数据无法分栏展示

解决TCPDF中两表数据分列显示问题

问题根源

你当前的代码逻辑是先完整输出checklist表的所有键值对,每输出一项就换行,导致TCPDF的文本光标始终停在第一列的行位置;后续处理checklist_notez时,所有Cell都会继续在第一列输出,完全偏离了预期的第二列位置。

修复方案

先将两个表的数据分别整理成独立的键值对数组,然后按行同步输出两列内容:每行先输出第一列的对应项(无内容则填空单元格),再输出第二列的对应项,确保每一行的两列内容在同一行显示。

修改后的完整代码

<?php
require_once('tcpdf.php');
include('config.php');

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['reg_number'])) {
    $reg_number = mysqli_real_escape_string($link, $_POST['reg_number']);

    // Fetch data from checklist
    $checklistSql = "SELECT * FROM checklist WHERE reg_number = '$reg_number'";
    $checklistResult = mysqli_query($link, $checklistSql);

    if (!$checklistResult) {
        die("Error fetching checklist data: " . mysqli_error($link));
    }

    // Fetch data from checklist_notez
    $noteSql = "SELECT * FROM checklist_notez WHERE reg_number2 = '$reg_number'";
    $noteResult = mysqli_query($link, $noteSql);

    if (!$noteResult) {
        die("Error fetching checklist_notez data: " . mysqli_error($link));
    }

    // 整理checklist数据为键值对数组
    $checklistItems = [];
    while ($checklistRow = mysqli_fetch_assoc($checklistResult)) {
        foreach ($checklistRow as $key => $value) {
            if ($key !== 'reg_number' && $key !== 'reg_number2') { // 排除主键/关联字段
                $checklistItems[] = $key . ': ' . $value;
            }
        }
    }

    // 整理checklist_notez数据为键值对数组
    $noteItems = [];
    while ($noteRow = mysqli_fetch_assoc($noteResult)) {
        foreach ($noteRow as $key => $value) {
            if ($key !== 'reg_number' && $key !== 'reg_number2') { // 排除主键/关联字段
                $noteItems[] = $key . ': ' . $value;
            }
        }
    }

    // Create PDF instance
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    $pdf->AddPage();
    $pdf->SetFont('times', 12);

    // Display headers
    $pdf->Cell(70, 10, 'Checklist', 1);
    $pdf->Cell(70, 10, 'Checklist_notez', 1);
    $pdf->Ln();

    // 取两个数组的最大行数,确保所有内容都能输出
    $maxRows = max(count($checklistItems), count($noteItems));

    // 逐行输出两列内容
    for ($i = 0; $i < $maxRows; $i++) {
        // 输出第一列内容,无则填空
        $checklistContent = isset($checklistItems[$i]) ? $checklistItems[$i] : '';
        $pdf->Cell(70, 10, $checklistContent, 1);

        // 输出第二列内容,无则填空
        $noteContent = isset($noteItems[$i]) ? $noteItems[$i] : '';
        $pdf->Cell(70, 10, $noteContent, 1);

        // 换行到下一行
        $pdf->Ln();
    }

    // Close the result sets
    mysqli_free_result($checklistResult);
    mysqli_free_result($noteResult);

    // Close the database connection
    mysqli_close($link);

    // Output the PDF as a download
    $pdfFileName = 'combined_checklist_' . $reg_number . '.pdf';
    $pdf->Output($pdfFileName, 'D'); // 'D' to force download
}
?>

额外说明

  • 代码中增加了排除reg_number/reg_number2字段的逻辑,避免无关的关联字段出现在PDF中;
  • 通过max(count(...))确保两个列的行数对齐,不会出现某列提前结束的情况;
  • 每行严格先输出第一列、再输出第二列,完全符合你预期的分栏显示效果。

内容的提问来源于stack exchange,提问作者mohaabed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:47:07