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

Moodle开发问题:查询数据库生成PDF文件内容为空无数据

问题排查及修复方案

核心错误点

  • 数据库查询方法使用错误:Moodle的get_record_sql()仅返回单条记录对象,查询全表多条数据需使用get_records_sql();且Moodle DB类返回的结果不是mysqli原生结果集,不能用mysqli_fetch_assoc()遍历。
  • 代码执行顺序错误:FPDF的Output()方法执行后会直接终止后续逻辑,你把数据遍历、写入PDF的逻辑全部放在Output()之后,永远不会执行。
  • 数据没有写入PDF:现有遍历逻辑是输出HTML表格标签,没有调用FPDF的Cell()方法将数据写入PDF实例,PDF自然只有表头没有内容。
  • 多余输出干扰:导出PDF的逻辑不需要输出Moodle页面的$OUTPUT->header()和$OUTPUT->footer(),多余的输出可能导致PDF文件格式损坏。

修复后的完整manage.php代码

<?php
/**
 * @package     tool_report
 * @author      Kristian
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
require('fpdf/fpdf.php');
require_once(__DIR__ . '/../../../config.php');
defined('MOODLE_INTERNAL') || die();

global $DB;

// Moodle SQL表名用{}占位符自动适配表前缀,不要硬编码mdl_
$sql = " SELECT * FROM {bigbluebuttonbn} ";
// 获取全表多条记录
$records = $DB->get_records_sql($sql);

$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Courier','B',16);
// 输出表头,最后一个参数设为1表示写完当前行换行
$pdf->Cell(50,10,'Course ID', '1', '0', 'C');
$pdf->Cell(50,10,'Course TYPE', '1', '0', 'C');
$pdf->Cell(50,10,'Course COURSE', '1', '0', 'C');
$pdf->Cell(50,10,'Course NAME', '1', '1', 'C');

// 遍历数据写入PDF
$pdf->SetFont('Courier','',14);
foreach ($records as $row) {
    $pdf->Cell(50,10, $row->id, '1', '0', 'C');
    $pdf->Cell(50,10, $row->type, '1', '0', 'C');
    $pdf->Cell(50,10, $row->course, '1', '0', 'C');
    $pdf->Cell(50,10, $row->name, '1', '1', 'C');
}

// 输出PDF后终止逻辑
$pdf->Output();
die();
?>

补充注意事项

  • 确认fpdf文件路径正确,require('fpdf/fpdf.php')前不要有任何空格、换行等多余输出,避免PDF格式损坏。
  • lib.php的表单提交逻辑不需要修改,保留现有代码即可正常触发导出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:24:02