mysqli_stmt::execute

mysqli_stmt_execute

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::execute -- mysqli_stmt_execute执行预处理语句

说明

面向对象风格

public mysqli_stmt::execute(?array $params = null): bool

过程式风格

mysqli_stmt_execute(mysqli_stmt $statement, ?array $params = null): bool

执行先前准备好的语句。该语句必须在执行之前成功准备,可以使用 mysqli_prepare()mysqli_stmt_prepare() 函数,或者通过将第二个参数传递给 mysqli_stmt::__construct()

如果语句是 UPDATEDELETEINSERT,可以使用 mysqli_stmt_affected_rows() 函数确定受影响的总行数。如果查询产生结果集,可以使用 mysqli_stmt_get_result() 函数获取,或者使用 mysqli_stmt_fetch() 函数直接从语句中逐行获取。

参数

statement

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

params

一个可选的列表 array,其中包含与正在执行的 SQL 语句中绑定的参数一样多的元素。每个值都被视为 string

返回值

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

错误/异常

如果启用了 mysqli 错误报告 (MYSQLI_REPORT_ERROR) 并且请求的操作失败,则会生成警告。如果此外模式设置为 MYSQLI_REPORT_STRICT,则会抛出 mysqli_sql_exception 而不是警告。

变更日志

版本 说明
8.1.0 添加了可选的 params 参数。

示例

示例 #1 使用绑定变量执行预处理语句

面向对象风格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");

/* 准备一个插入语句 */
$stmt = $mysqli->prepare("INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)");

/* 将变量绑定到参数 */
$stmt->bind_param("sss", $val1, $val2, $val3);

$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';

/* 执行语句 */
$stmt->execute();

$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';

/* 执行语句 */
$stmt->execute();

/* 从 myCity 中检索所有行 */
$query = "SELECT Name, CountryCode, District FROM myCity";
$result = $mysqli->query($query);
while (
$row = $result->fetch_row()) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

过程式风格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

/* 准备插入语句 */
$stmt = mysqli_prepare($link, "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)");

/* 绑定变量到参数 */
mysqli_stmt_bind_param($stmt, "sss", $val1, $val2, $val3);

$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';

/* 执行语句 */
mysqli_stmt_execute($stmt);

$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';

/* 执行语句 */
mysqli_stmt_execute($stmt);

/* 从 myCity 中检索所有行 */
$query = "SELECT Name, CountryCode, District FROM myCity";
$result = mysqli_query($link, $query);
while (
$row = mysqli_fetch_row($result)) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

以上示例将输出

Stuttgart (DEU,Baden-Wuerttemberg)
Bordeaux (FRA,Aquitaine)

示例 #2 使用值数组执行准备好的语句

面向对象风格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

$mysqli->query('CREATE TEMPORARY TABLE myCity LIKE City');

/* 准备插入语句 */
$stmt = $mysqli->prepare('INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)');

/* 执行语句 */
$stmt->execute(['Stuttgart', 'DEU', 'Baden-Wuerttemberg']);

/* 从 myCity 中检索所有行 */
$query = 'SELECT Name, CountryCode, District FROM myCity';
$result = $mysqli->query($query);
while (
$row = $result->fetch_row()) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

过程式风格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');

mysqli_query($link, 'CREATE TEMPORARY TABLE myCity LIKE City');

/* 准备插入语句 */
$stmt = mysqli_prepare($link, 'INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)');

/* 执行语句 */
mysqli_stmt_execute($stmt, ['Stuttgart', 'DEU', 'Baden-Wuerttemberg']);

/* 从 myCity 中检索所有行 */
$query = 'SELECT Name, CountryCode, District FROM myCity';
$result = mysqli_query($link, $query);
while (
$row = mysqli_fetch_row($result)) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

以上示例将输出

Stuttgart (DEU,Baden-Wuerttemberg)

另请参阅

添加注释

用户贡献注释 2 条注释

Typer85 at gmail dot com
17 年前
为了澄清手册中关于此函数的注释

“注意:当使用 mysqli_stmt_execute() 时,必须使用 mysqli_stmt_fetch() 函数在执行任何其他查询之前获取数据。”

这是因为此函数不会在客户端存储结果集,因此您必须获取结果集中的所有内容,否则您可能会遇到重大错误。

但是,如果您在使用此函数后立即使用 mysqli_stmt_store_result 函数,则强制结果集存储在客户端,因此在获取所有数据之前安全地发出额外的查询。

您确实需要根据应用程序的优先级做出选择。如果您知道结果集占用大量内存,那么最好不要将其存储在客户端,这样就不会出现服务器上可用内存不足的错误。但这同时也意味着您不会对结果集进行大量计算,否则您将阻止对结果集来源的表的任何其他使用,直到您获取完所有内容。

如果您要进行大量计算,或者您的结果集不占用大量内存,那么最好将其存储在客户端。

如果您服务器上有大量可用内存,那么大多数这些问题都可以轻松解决,但这通常不是共享主机的情况。

如果您在共享主机上,一个聪明的解决此问题的方法是在设计查询时要聪明一些。如果您知道将获取占用大量内存的结果集,请尝试限制结果集。

测试应用程序的不同替代方案,并查看在不同条件下什么最适合您。

祝您好运,
andrey at php dot net
18 年前
如果您选择 LOB,请使用以下执行顺序,否则您可能会导致 mysqli 分配比实际使用更多的内存

1)prepare()
2)execute()
3)store_result()
4)bind_result()

如果您跳过 3) 或交换 3) 和 4),则 mysqli 将为该列的最大长度分配内存,对于 tinyblob 为 255,对于 blob 为 64k(仍然可以),对于 MEDIUMBLOB 为 16MByte - 相当多,对于 LONGBLOB 为 4G(如果您有这么多内存,那就很好)。使用此顺序的查询在存在 LOB 时速度稍慢,但这是避免在几秒钟内耗尽内存的代价。
To Top