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

PHP写入MySQL longblob字段始终为NULL的问题求助

PHP写入MySQL longblob字段始终为NULL的问题求助

你好,我仔细看了你的问题和代码,发现几个可能导致on_file字段一直为NULL的关键点,咱们一步步排查解决:

问题概述

你在VPS上搭建网站,需要将服务器audio文件夹中的音频文件写入MySQL的longblob字段,但PHP代码执行后其他字段都正常写入,唯独on_file是NULL。已经配置了php.ini和Apache支持100MB文件上传,小文本文件测试也失败,但用Python可以成功写入,文件权限也确认正常能读取。

可能的问题点及解决方案

1. 参数绑定类型不匹配

你的代码里bind_param用的类型是"sssis",最后一个参数对应on_file字段,类型是s(字符串),但对于longblob这种二进制字段,应该用b(blob)类型来绑定,否则MySQL可能无法正确识别传递的二进制数据。

修正后的绑定代码:

// 把最后一个类型从's'改成'b'
$stmt->bind_param("sssib", $user_id, $file_name, $path_, $file_status, $null);

2. 未检查文件读取和SQL执行的错误

虽然你说能读取文件,但还是建议加上读取失败的判断;另外SQL执行后也没有检查错误,这可能隐藏了关键问题(比如字段类型不对、权限不足等)。

添加错误检查的代码片段:

$file_content = file_get_contents($file_path);
// 检查文件是否读取成功
if ($file_content === false) {
    error_log("无法读取文件: {$file_path}");
    continue;
}

// 执行SQL后检查错误
if (!$stmt->execute()) {
    error_log("插入文件 {$file_name} 失败,错误信息: {$stmt->error}");
}

3. 确认数据库字段类型

请检查tb_files表的on_file字段是否确实是LONGBLOB类型:

  • 如果是普通BLOB类型,最大只能存储64KB数据,小文件可能也会溢出
  • LONGBLOB支持最大4GB的数据,完全符合你100MB的需求

4. 路径拼接的正确性

确认$directory变量的路径是否正确,比如是否包含末尾的斜杠,避免拼接成类似/audiofile.mp3这种错误路径,导致file_get_contents读取失败。

修正后的完整代码示例

$conn = new mysqli($host, $user, $password, $dbname);

if ($conn->connect_error) {
    die("Ошибка подключения: " . $conn->connect_error);
}

$user_id = $_COOKIE['user_id'] ?? null;
$path_ = "c:";
$file_status = 1;

if (!is_null($user_id) && !empty($files)) {
    $stmt = $conn->prepare("INSERT INTO tb_files (user_id, name_, path_, file_status, on_file) VALUES (?, ?, ?, ?, ?)");
    foreach ($files as $file_name) {
        $file_path = $directory . $file_name;
        $file_content = file_get_contents($file_path);
        
        // 检查文件读取状态
        if ($file_content === false) {
            error_log("无法读取文件: {$file_path}");
            continue;
        }
        
        $null = NULL;
        // 修正参数绑定类型,最后一个为blob类型
        $stmt->bind_param("sssib", $user_id, $file_name, $path_, $file_status, $null);
        $stmt->send_long_data(4, $file_content);
        
        // 执行并记录错误
        if (!$stmt->execute()) {
            error_log("插入失败:文件 {$file_name},错误:{$stmt->error}");
        }
    }
    $stmt->close();
}
$conn->close();

额外排查建议

  • 查看PHP错误日志(通常在/var/log/php/或Apache的错误日志目录),里面可能有未显示的警告或错误
  • 确认服务器的SELinux是否开启,如果开启可能需要调整文件上下文权限,允许PHP读取audio文件夹的文件

备注:内容来源于stack exchange,提问作者Дмитрий

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 08:09:28