使用FPDF在PHP中生成含多图PDF时遇致命错误求解决
你遇到的错误提示如下:
Notice: Undefined index: gambarvk_image in C:\xampp\htdocs\login\laporan_vk\laporanVK.php on line 821
Notice: Trying to access array offset on value of type null in C:\xampp\htdocs\login\laporan_vk\laporanVK.php on line 821
Notice: Undefined variable: gambarvk_image in C:\xampp\htdocs\login\laporan_vk\laporanVK.php on line 825
Fatal error: Uncaught Exception: FPDF error: Image file has no extension and no type was specified: ./uploaded_img/ in C:\xampp\htdocs\login\laporan_vk\laporanVK-fpdf\fpdf.php:267 Stack trace: #0 C:\xampp\htdocs\login\laporan_vk\laporanVK-fpdf\fpdf.php(881): FPDF->Error('Image file has ...') #1 C:\xampp\htdocs\login\laporan_vk\laporanVK.php(825): FPDF->Image('./uploaded_img/', 150, 25, 50, 20, '') #2 {main} thrown in C:\xampp\htdocs\login\laporan_vk\laporanVK-fpdf\fpdf.php on line 267.
手动修改路径后出现的错误:
Fatal error: Uncaught Exception: FPDF error: Unsupported image type: png/ in C:\xampp\htdocs\login\laporan_vk\laporanVK-fpdf\fpdf.php:267 Stack trace: #0 C:\xampp\htdocs\login\laporan_vk\laporanVK-fpdf\fpdf.php(889): FPDF->Error('Unsupported ima...') #1 C:\xampp\htdocs\login\laporan_vk\laporanVK.php(825): FPDF->Image('./uploaded_img....', 150, 25, 50, 20, 'png/') #2 {main} thrown in C:\xampp\htdocs\login\laporan_vk\laporanVK-fpdf\fpdf.php on line 267
问题根源
核心错误出在PDF生成的遍历逻辑:
- 错误依赖表单提交时的
$_FILES变量,生成PDF时该变量不存在,导致Undefined index - 未从数据库查询结果
$row中获取图片文件名,误用了表单提交时的临时变量$gambarvk_image - 手动修改路径时把扩展名错误加到了文件夹名称里,导致路径和图片类型识别失败
修复后的完整代码
include 'config.php'; // 表单提交处理逻辑(建议后续改用预处理语句防SQL注入) if(isset($_POST['add_gambarvk'])) { $gambarvk_name = $_POST['gambarvk_name']; $gambarvk_image = $_FILES['gambarvk_image']['name']; $gambarvk_image_tmp_name = $_FILES['gambarvk_image']['tmp_name']; $size = getimagesize($gambarvk_image_tmp_name); $gambarvk_image_folder = './uploaded_img/' . $gambarvk_image; if(empty($gambarvk_name) || empty($gambarvk_image)) { $message[] = 'please fill out all'; } else { // 注意:此处存在SQL注入风险,建议替换为预处理语句 $insert = "INSERT INTO gambarvk(name, image) VALUES('$gambarvk_name', '$gambarvk_image')"; $upload = mysqli_query($conn,$insert); if($upload) { move_uploaded_file($gambarvk_image_tmp_name, $gambarvk_image_folder); $message[] = 'Gambar berjaya dimasukkan'; } else { $message[] = 'Gambar tidak berjaya dimasukkan'; } } }; $select = mysqli_query($conn, "SELECT * FROM gambarvk"); // 修复后的PDF图片生成逻辑 while($row = mysqli_fetch_assoc($select)) { // 从数据库行中获取存储的图片文件名 $image_filename = $row['image']; // 从文件名提取格式,不再依赖$_FILES变量 $image_format = strtolower(pathinfo($image_filename, PATHINFO_EXTENSION)); // 拼接正确的图片路径:文件夹 + 完整文件名 $image_path = './uploaded_img/' . $image_filename; // 调用FPDF的Image方法 $pdf->Image($image_path, 150, 25, 50, 20, $image_format); }
关键修改说明
- 移除
$_FILES依赖:生成PDF时,$_FILES仅在表单上传时存在,必须从数据库查询结果$row['image']获取已存储的文件名 - 正确提取图片格式:通过数据库中的文件名解析扩展名,避免依赖临时变量
- 修正路径拼接:路径格式为
./uploaded_img/+ 完整文件名,不要将扩展名错误添加到文件夹名称中 - 可选安全优化:原插入语句存在SQL注入风险,建议替换为mysqli预处理语句:
$insert = $conn->prepare("INSERT INTO gambarvk(name, image) VALUES(?, ?)"); $insert->bind_param("ss", $gambarvk_name, $gambarvk_image); $upload = $insert->execute();
内容的提问来源于stack exchange,提问作者thir

