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,提问作者Дмитрий
相关产品推荐
相关产品推荐

