我正在尝试通过 PHP 将单个文件的数据连同一些其他数据(如文件名、字节大小、sha256 校验和等)插入到 LONGBLOB 列中。
我知道表本身没有问题,因为我可以通过 phpMyAdmin 一次插入文件和其余列,这表明我使用以下 MySQL INSERT 语句:
INSERT INTO DB_NAME.TABLE_NAME (SHA256SUM, FILE_NAME, FILE_DATA) VALUES (?, ?, ?)
所以我的 PHP 代码目前看起来像这样:
$mysqli_query = 'INSERT INTO DB_NAME.TABLE_NAME (SHA256SUM, FILE_NAME, FILE_DATA) VALUES (?, ?, ?)';
$stmt = $mysqli->prepare($mysqli_query);
$null = NULL;
$stmt->bind_param("ssb", $sha256sum, $_FILES['career_application_FILE_UPLOAD']['name'], $null);
$stmt->send_long_data(0, file_get_contents($_FILES['career_application_FILE_UPLOAD']['tmp_name']));
$stmt->execute();
这几乎正是 Oracle 建议的 right here .
但出于某种原因,它一直对我不起作用。 (相信我,过去 3 个小时我一直在努力。)
它一直返回一般的 MySQL 错误“COLUMN FILE_DATA CANNOT BE NULL”。
所以我在 FILE_DATA 列上启用了 NULL 值,然后 INSERT 会起作用,但是 FILE_DATA 列(应该用 BLOB 数据填充)只是读取 NULL。
所以我在 FILE_DATA 列上禁用了 NULL 值,并在 send_long_data 部分之后放置了一个 $stmt_error = $stmt->error;
行,我发现了以下错误:
Can't send long data for non-string/non-binary data types
我试图破译这意味着什么,但无法破译,所以我在这里寻求帮助。
我要睡一觉了,希望明天早上我能回答我自己的愚蠢问题……我只是觉得这是一件非常明显的事情,我太累了,现在没注意到它。
一些细节:
- 我在 Debian 8 和 NGINX v1.6.2 上运行这段代码
- 我已四重检查我的 MySQL max_allowed_packet 是否设置为默认值 16776192(无论如何这应该无关紧要,因为我尝试上传的文件大小只有几字节到几千字节)
- 我尝试上传所有不同类型的文件(txt、mov、png、pdf 等)
- 我对 PHP 或 MySQL 一点也不陌生,我已经使用它们超过 10 年了
- 我什至尝试将 LONGBLOB 排序规则设置为二进制,因为整个表的排序规则都是 ascii...但是无法更改 LONGBLOB 排序规则,这也不重要,因为就像我最初说的...phpMyAdmin 没有将文件数据插入 LONGBLOB 列时出现问题)
感谢阅读。
最佳答案
由于我的愚蠢,我没有完整地阅读 send_long_data 的规范,只是假设 0 是一些无关紧要的占位符。
这不是微不足道的。
本应为 2,相当于 MySQL INSERT 的第 3 个参数。
关于php - "Can' t 发送非字符串/非二进制数据类型的长数据到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42407679/