PHP图片存入数据库后无法显示的技术问题求助
问题分析与修复方案
你在将图片存入数据库后无法正常显示的问题,主要出在display.php的响应头设置和内容输出逻辑上,另外插入环节也有SQL注入风险需要优化。下面分步骤帮你解决:
一、显示环节(display.php)的核心错误
- 错误的响应头设置:你写的
header("data:image/png;base64");是完全不合法的HTTP响应头。如果要直接输出图片二进制内容,应该设置正确的Content-Type;如果要通过base64嵌入到img标签,不需要设置这个头,直接输出完整的img标签即可。 - 未检查查询结果是否存在:如果查询不到对应记录,
$row会是null,调用$row['Photograph']会直接报错。 - 图片类型硬编码问题:假设所有图片都是png/jpg,但实际上传的图片类型可能不同,最好从数据库里存储的文件名自动匹配类型。
修正后的display.php代码
<?php $servername = "***********"; $username = "*************"; $password = "**********"; // 创建数据库连接 $conn = new mysqli($servername, $username, $password,"u932729557_main"); // 检查连接状态 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $targetName = "Umang Bajaj"; // 使用预处理语句避免SQL注入 $stmt = $conn->prepare("SELECT Photograph, names FROM photograph_submission WHERE Name = ?"); $stmt->bind_param("s", $targetName); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); // 从文件名提取后缀,匹配对应的MIME类型 $fileExt = strtolower(pathinfo($row['names'], PATHINFO_EXTENSION)); $mimeType = match($fileExt) { 'jpg', 'jpeg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif', default => 'application/octet-stream' }; // 方式1:直接输出图片二进制(访问页面时直接显示图片) header("Content-Type: $mimeType"); echo $row['Photograph']; // 方式2:输出img标签(如果需要在网页中嵌入,注释上面两行,解开下面一行) // echo '<img src="data:' . $mimeType . ';base64,' . base64_encode($row['Photograph']) . '"/>'; } else { echo "No image found for the specified name."; } // 关闭语句和连接 $stmt->close(); $conn->close(); ?>
二、插入环节(photography.php)的优化建议
你的插入代码存在严重的SQL注入风险,直接拼接用户输入到SQL语句中非常危险,建议改用预处理语句,同时完善上传验证逻辑:
修正后的photography.php插入逻辑
<?php $servername = "********"; $username = "*******"; $password = "*******"; // 创建数据库连接 $conn = new mysqli($servername, $username, $password,"*****"); // 检查连接状态 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } if(isset($_POST['submit'])) { $name = trim($_POST['name']); // 验证表单输入和文件上传状态 if(!empty($name) && isset($_FILES['userfile']) && $_FILES['userfile']['error'] === UPLOAD_ERR_OK) { $imgData = file_get_contents($_FILES['userfile']['tmp_name']); $fileName = $_FILES['userfile']['name']; // 使用预处理语句插入数据 $stmt = $conn->prepare("INSERT INTO photograph_submission(Name, Photograph, names) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $name, $imgData, $fileName); if($stmt->execute()) { header('Location: thank.html'); exit; // 跳转后必须终止脚本,避免后续代码执行 } else { echo "Error: " . $stmt->error; } $stmt->close(); } else { $message = "Please enter all * marked details and ensure the image uploads correctly.\nTry again."; echo "<script type='text/javascript'>alert('$message'); window.location = 'photography.html';</script>"; } } $conn->close(); ?>
关键注意事项
- 数据库字段类型:存储图片的
Photograph字段必须设置为LONGBLOB类型,确保能容纳大尺寸图片。 - 文件上传验证:建议增加对上传文件类型、大小的限制,防止恶意文件上传。
- 跳转后终止脚本:在
header('Location: ...')之后一定要加上exit;或die();,避免后续代码继续执行导致意外问题。
内容的提问来源于stack exchange,提问作者Umang Bajaj
相关产品推荐
相关产品推荐

