PHP Conference Japan 2024

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();
?>

参见

添加注释

用户贡献的笔记 3 条笔记

ChrisH
5 年前
如果您尝试写入单个字段,而该字段的大小超过了 max_allowed_packet,则此函数将无法帮助您(与上面文档示例似乎显示的相反)。

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

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

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

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

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

希望能帮到您。
DimeCadmium
3 年前
关于 ChrisH 的注释,您必须多次使用相同的 $param_nr 调用此函数,以发送前 max_allowed_packet 字节,然后发送下一个字节,依此类推。因此,您可能需要对更改 substr() 索引等进行 for 循环。
To Top