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

PHP图片存入数据库后无法显示的技术问题求助

问题分析与修复方案

你在将图片存入数据库后无法正常显示的问题,主要出在display.php的响应头设置和内容输出逻辑上,另外插入环节也有SQL注入风险需要优化。下面分步骤帮你解决:

一、显示环节(display.php)的核心错误

  1. 错误的响应头设置:你写的header("data:image/png;base64");是完全不合法的HTTP响应头。如果要直接输出图片二进制内容,应该设置正确的Content-Type;如果要通过base64嵌入到img标签,不需要设置这个头,直接输出完整的img标签即可。
  2. 未检查查询结果是否存在:如果查询不到对应记录,$row会是null,调用$row['Photograph']会直接报错。
  3. 图片类型硬编码问题:假设所有图片都是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:39:46