TCPDF:为啥即使单击不同单元格的按钮,“生成 pdf”按钮也会显示相同的数据?

Posted

技术标签:

【中文标题】TCPDF:为啥即使单击不同单元格的按钮,“生成 pdf”按钮也会显示相同的数据?【英文标题】:TCPDF: why "generate pdf" button shows the same data even when different cell's button is clicked?TCPDF:为什么即使单击不同单元格的按钮,“生成 pdf”按钮也会显示相同的数据? 【发布时间】:2022-01-20 20:18:41 【问题描述】:

我正在使用DataTable 显示数据,每个单元格都有“编辑、删除、生成 PDF”。使用 Ajax 的添加、编辑和删除功能运行良好。单击“生成 PDF”时,它将在新选项卡中打开,其中包含单击单元格按钮的数据。但是,当我单击其他按钮时,它总是显示第一个单元格的数据,即使 URL 包含该单元格的 id

如何根据按钮点击将数据传输到PDF?

$statement = $connection->prepare($query);
$statement->execute();

$result = $statement->fetchAll();
$data = [];

$filtered_rows = $statement->rowCount();

foreach ($result as $row) 
    $sub_array = [];
    $sub_array[] = $row["cccEmployee"];
    $sub_array[] = $row["irNumber"];
    $sub_array[] = $row["caseType"];
    $sub_array[] = $row["caseLocation"];
    $sub_array[] = $row["startDateTime"];
    $sub_array[] = $row["endDateTime"];
    // $sub_array[] = $row["caseDesc"];
    // $sub_array[] = $row["actionsTaken"];
    // $sub_array[] = $row["caseDetails"];
    // $sub_array[] = $row["caseNotes"];
    // $sub_array[] = $row["caseRecommendation"];
    
    $sub_array[] = '<a href="javascript:void(0)" name="update" class="update_report" title="Edit" id="'.$row["id"] .'">
                         <i class="fas fa-edit"></i>
                    </a>';
    $sub_array[] = '<a href="javascript:void(0)" name="delete" class="delete_report" title="Delete" id="'.$row["id"] .'">
                         <i class="fas fa-trash-alt"></i>
                    </a>';
    $sub_array[] = '<a href="/test-pdf/'.$row['id'].'" target="_blank" id="'.$row["id"] .'">
                        <input type="submit" class="btn btn-danger generate_pdf" name="generate_pdf" id="generate_pdf" value="Generate PDF"/>
                    </a>'; // This is the code for the PDF.

    $data[] = $sub_array;


$output = [
    "draw" => intval($_POST["draw"]),
    "recordsTotal" => $filtered_rows,
    "recordsFiltered" => get_total_reports(),
    "data" => $data,
];

echo json_encode($output);

生成-pdf-report.php:

include('./TCPDF/tcpdf.php');

    $query = "SELECT * FROM cases_reports";

    $statement = $connection->prepare($query);
    $statement->execute();

    while( $row = $statement->fetch(PDO::FETCH_ASSOC) ) 
        $reportId = $row['id'];
        $cccEmployee = $row['cccEmployee'];
    
    
    // Define the variables

    ob_start();
    // make TCPDF object
    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);

    // set document information
    $pdf->SetCreator('Mushref'); // $cccEmployee
    $pdf->SetAuthor('Abdulrahman Mushref'); // $cccEmployee
    $pdf->SetTitle("IR Number here"); // $caseType + $irNumber
    $pdf->SetSubject('TCPDF Tutorial');
    $pdf->SetKeywords("Case, PDF, report, 'caseType'"); // $caseType

    // add a page
    $pdf->AddPage();

    // Remove default header/footer
    $pdf->setPrintFooter(false);

    // set some text to print
    $content = '';
    $content .= '  
      <div>
        <h4 align="center"> TEST '.$reportId.'</h4>
        <h4 align="center"> Employee Name: '.$cccEmployee.'</h4>

      ';  
    $content .= '</div>';  
    $pdf->writehtml($content);  

    //Close and output PDF document
    ob_end_clean();
    $pdf->Output('test.pdf', 'I');

我正在使用此库进行路由,请检查 /test-pdf,因为它是 TCPDF 代码的 url。

// FOR TESTING
get('/test-pdf', '/backend/reports/generate-pdf-report.php');
get('/test-pdf/$report_id', '/backend/reports/generate-pdf-report.php');

【问题讨论】:

【参考方案1】:

您没有将变量传递给 PDF 生成器 PHP 文件,并且在 PDF 生成文件中没有使用 $row['id'],这就是您获得相同数据的原因。

在少数地方进行更改将使事情按预期进行。

将 $row['id'] 值传递给 php 文件。

$sub_array[] = '
<a href="/test-pdf/rid/'.$row['id'].'" target="_blank" id="'.$row["id"] .'">
  <input type="submit" class="btn btn-danger generate_pdf" name="generate_pdf" id="generate_pdf" value="Generate PDF"/>
</a>'; // This is the code for the PDF.

get('/test-pdf/rid/$rid', '/backend/reports/generate-pdf-report.php');

然后在php文件里面使用它。


$id = $_GET['rid'];

$query = "SELECT * FROM cases_reports WHERE `id`= ?";
$statement = $connection->prepare($query);
$statement->bind_param("s", $id);
...

【讨论】:

很好,但我收到了这些错误:警告:include_once(C:/xampp/htdocs//backend/reports/generate-pdf-report.php?rid=$report_id): failed to open stream: No error in C:\xampp\htdocs\router.php on line 51 Warning: include_once(): Failed opening 'C:/xampp/htdocs//backend/reports/generate-pdf-report.php?rid=$report_id' for inclusion (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\router.php on line 51 还在想办法。 这是一个不同的问题,我的回答与您发布的问题有关,如果您能够更早地进行测试,那么这应该可以正常工作。但是,如果您提供路由的工作原理以及它如何处理参数传递,则可以解决此问题。 我用这个路由:phprouter.com 我已经根据 PHP 路由器动态路由策略更新了我的答案,看看。此处参考文档phprouter.com/get-dynamic-routes

以上是关于TCPDF:为啥即使单击不同单元格的按钮,“生成 pdf”按钮也会显示相同的数据?的主要内容,如果未能解决你的问题,请参考以下文章

快速单击其中一个 tableview 单元格内的按钮后重新加载 tableview

为啥在 php 中使用 TCPDF 的单元格中存在左侧和顶部填充?

html 单击按钮删除某一单元格的内容

根据获得的当前单元格的索引路径,自定义单元格中的按钮单击功能

为啥我的 Tableview 重用了一些单元格?

需要 VBA 代码才能单击将内容从一个单元格移动到另一个单元格的按钮