mysqli_stmt::send_long_data

mysqli_stmt_send_long_data

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::send_long_data -- mysqli_stmt_send_long_data分块发送数据

说明

面向对象风格

public mysqli_stmt::send_long_data(int $param_num, string $data): bool

过程式风格

mysqli_stmt_send_long_data(mysqli_stmt $statement, int $param_num, string $data): bool

允许将参数数据分段(或分块)发送到服务器,例如,如果 Blob 的大小超过 max_allowed_packet 的大小。此函数可以多次调用来发送对应于列的字符或二进制数据值的各个部分,该列必须是 TEXT 或 BLOB 数据类型之一。

参数

statement

仅限过程式风格:由 mysqli_stmt_init() 返回的 mysqli_stmt 对象。

param_num

指示要将数据关联到的参数。参数从 0 开始编号。

data

包含要发送数据的字符串。

返回值

成功时返回 true,失败时返回 false

范例

范例 #1 面向对象风格

<?php
$stmt
= $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen("messages.txt", "r");
while (!
feof($fp)) {
$stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);
$stmt->execute();
?>

参见

添加注释

用户贡献注释 4 个注释

3
ChrisH
4 年前
如果您尝试写入单个字段,而该字段超过 max_allowed_packet,那么此函数将无法帮助您(与上面文档示例所示相反)。

MySQL 中的参数仍然受每个字段的 max_allowed_packet 限制,因此您会收到类似以下的错误

“mysqli_sql_exception: 通过 mysql_send_long_data() 设置的准备语句的参数长度超过 'max_long_data_size' 字节”

此函数的唯一实际用例似乎是,如果您正在写入多个长字段,这些字段组合在一起会超过 max_allowed_packet。
3
Gustavo Narea
18 年前
以防万一

'max_allowed_packet' 是一个 MySQL 变量;它不是 PHP 函数/变量/常量。

更多信息:https://dev.mysqlserver.cn/doc/refman/4.1/en/packet-too-large.html

希望对您有所帮助。
0
DimeCadmium
3 年前
针对 ChrisH 的注释,您必须使用相同的 $param_nr 多次调用此函数,以发送前 max_allowed_packet 字节,然后发送下一个字节,依此类推。因此,您可能需要使用 for 循环遍历更改的 substr() 索引等。
-10
lussnig at smcc dot de
18 年前
send_long_data() 此函数通常用于将数据存储在二进制 Blob 字段中。但是,如果表为 UTF8,并且连接字符集不期望二进制数据(例如图像),则它将采用 utf8 数据。
这意味着您必须在发送二进制数据之前进行 utf8_encode。
To Top