php - "Can' t 发送非字符串/非二进制数据类型的长数据到底是什么意思?

标签 php mysql mysqli blob

我正在尝试通过 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_pa​​cket 是否设置为默认值 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/

相关文章:

PHP 内爆替代 mysql 查询

php - 如何在 php 中添加延迟显示数据库值

php - 来自mysql的多维数组用于数据可视化

php oci8 - 如何设置 oracle 时间戳返回格式

php - file_get_contents 接收 cookie

php - 为什么 PHP 的 htmlentities() 不转换 – 字符?

php - DataTables 1.9.4 - 限制结果

php - Twig 中的舍入数字

php - 勾选连接表中的复选框

python - sqlalchemy 连接到 VPS 数据库