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
相关产品推荐
相关产品推荐

