我想当我需要通过 mysqli 向数据库插入超过max_allowed_packet
-size 的 BLOB 时,我可以使用send_long_data
. 这似乎对每个人都有效(见这个或这个或这个)。这是一个(不)工作的最小示例:
<?php
# Establishing connection
$db = new mysqli('localhost', 'user', 'password', 'database');
$db->query('SET CHARACTER SET "utf8"');
# Get max value
$res = $db->query('SHOW VARIABLES WHERE `Variable_name` = "max_allowed_packet"');
$max = (int)$res->fetch_assoc()['Value'];
$res->free();
# Prepare
$content = file_get_contents('C:\\file.png');
$stmt = $db->prepare('UPDATE `table` SET `field` = ? WHERE `id` = ?');
$null = null;
$id = 1;
$stmt->bind_param('bi', $null, $id);
# send_long_data
$m = $max -8;
$p = -$m;
$l = strlen($content) + $p;
while($p < $l)
$stmt->send_long_data(0, substr($content, $p += $m, $m));
if(!$stmt->execute())
echo "{$db->errno}: {$db->error}";
# finalize
$stmt->close();
$db->close();
?>
如果包尺寸小于max_packet_size
. 如果不是,有几个问题:
- 如果我只是设置
$m
为$max
,它将无法正常工作。错误信息是2006: MySQL server has gone away
;在此之前,给出警告:Warning: Error while sending STMT_SEND_LONG_DATA packet. ... on line 20
(20 is$stmt->send_long_data
) - 所以我必须从中减去至少 8 的值
max_packet_size
。为什么是8?它依赖于什么吗?为什么不简单max_packet_size
呢? - 但是好的,我减去8。然后是以下错误:
1105: Parameter of prepared statement which is set through mysql_send_long_data() is longer than 'max_allowed_packet' bytes
substr
肯定返回字节数,如mbstring.func_overload = 0
.- 如果我不使用 while 循环,则可以传输图像 - 但是当然不会传输图像的一部分。我认为
send_long_data
正是为了这个目的,您可以传输超过max_packet_size
字节! - 顺便说一句:为什么错误消息告诉我一些关于
mysql_send_long_data
而不是的事情mysqli_send_long_data
? - 我认为这可能是 MySQL 的错误,所以我从 5.5 更新到 5.6.11(当前);这并没有解决任何问题。
- 我正在使用 PHP 5.4.12。
- 数据库字段是类型
LONGBLOB
并且绝对能够保存数据。如果我增加max_packet_size
,一切正常。但我不能依赖访问服务器变量的操作。
我能做些什么来传输超过max_packet_size
字节?