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

PHP上传图片时MySQL数据库mediumblob类型BLOB数据写入失败问题

问题根因
  • 核心原因是mysqli预处理语句绑定b类型二进制参数时,不支持直接将二进制内容作为变量传入,需要调用专用方法发送数据,直接绑定会导致二进制数据被截断或识别为空
  • 次要可能原因:
    • MySQL服务端max_allowed_packet配置值小于实际上传文件大小,触发数据包大小限制导致二进制内容写入被丢弃
    • 数据库连接未正确设置字符集,二进制内容被字符转义逻辑破坏
    • 上传文件本身存在异常(比如临时文件读取失败)未被捕获
解决方案

1. 修改BLOB参数绑定逻辑(优先操作)

按照mysqli二进制数据写入规范调整代码,使用send_long_data方法发送BLOB内容,代码示例如下:

if(isset($_POST['file_one_submit'])){
    $post = 'file_one_input';
    // 先校验上传是否正常
    if ($_FILES[$post]['error'] !== UPLOAD_ERR_OK) {
        die("上传失败,错误码:".$_FILES[$post]['error']);
    }
    $file = file_get_contents($_FILES[$post]['tmp_name']);
    $name = $_FILES[$post]['name'];
    $size = $_FILES[$post]['size'];
    $format = pathinfo($name, PATHINFO_EXTENSION);
    // 预处理语句
    $stmt = $conn -> prepare("REPLACE INTO `images` (id, name, size, format, file) VALUES(?, ?, ?, ?, ?);");
    // 绑定参数时BLOB位置传入null占位
    $stmt -> bind_param("isisb", $id, $name, $size, $format, $null);
    // 索引从0开始计数,第5个参数对应索引为4,传入二进制内容
    $stmt->send_long_data(4, $file);
    $stmt -> execute();
}

2. 调整MySQL数据包大小限制

修改MySQL配置文件my.cnf(Windows下为my.ini),添加或修改以下配置:

max_allowed_packet = 32M

修改后重启MySQL服务生效,配置值需大于你允许上传的最大图片大小。

3. 校验数据库连接字符集

在初始化数据库连接后,添加字符集设置代码,避免转义逻辑异常:

$conn = new mysqli($host, $user, $pwd, $dbname);
// 连接成功后设置字符集
$conn->set_charset('utf8mb4');

内容的提问来源于stack exchange,提问作者541daw35d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:36:06