2024 年 PHP 日本会议

mysqli::execute_query

mysqli_execute_query

(PHP 8 >= 8.2.0)

mysqli::execute_query -- mysqli_execute_query准备、绑定参数并执行 SQL 语句

描述

面向对象风格

public mysqli::execute_query(string $query, ?array $params = null): mysqli_result|bool

过程化风格

mysqli_execute_query(mysqli $mysql, string $query, ?array $params = null): mysqli_result|bool

准备 SQL 查询,绑定参数并执行它。mysqli::execute_query() 方法是 mysqli::prepare()mysqli_stmt::bind_param()mysqli_stmt::execute()mysqli_stmt::get_result() 的快捷方式。

语句模板可以包含零个或多个问号 (?) 参数标记——也称为占位符。参数值必须使用 params 参数作为 array 提供。

在后台会创建一个预处理语句,但它永远不会暴露在函数之外。不可能像使用 mysqli_stmt 对象那样访问语句的属性。由于此限制,状态信息会被复制到 mysqli 对象中,并可以使用其方法访问,例如 mysqli_affected_rows()mysqli_error()

注意:

如果将长度超过服务器 max_allowed_packet 的语句传递给 mysqli_execute_query(),则返回的错误代码会根据操作系统而有所不同。行为如下:

  • 在 Linux 上返回错误代码 1153。错误消息为 收到的数据包大小超过 max_allowed_packet 字节

  • 在 Windows 上返回错误代码 2006。此错误消息为 服务器已断开连接

参数

mysql

仅限过程化风格:由 mysqli_connect()mysqli_init() 返回的 mysqli 对象。

query

查询,作为字符串。它必须包含单个 SQL 语句。

SQL 语句可以包含零个或多个由问号 (?) 字符在适当位置表示的参数标记。

注意:

这些标记仅在 SQL 语句中的某些位置才合法。例如,它们允许在 INSERT 语句的 VALUES() 列表中(指定行的列值),或在 WHERE 子句中与列进行比较以指定比较值。但是,它们不允许用于标识符(例如表名或列名)。

params

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

返回值

失败时返回 false。对于产生结果集的成功查询(例如 SELECT, SHOW, DESCRIBEEXPLAIN),返回 mysqli_result 对象。对于其他成功查询,返回 true

示例

示例 #1 mysqli::execute_query() 示例

面向对象风格

<?php

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

$query = 'SELECT Name, District FROM City WHERE CountryCode=? ORDER BY Name LIMIT 5';
$result = $mysqli->execute_query($query, ['DEU']);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["District"]);
}

过程化风格

<?php

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

$query = 'SELECT Name, District FROM City WHERE CountryCode=? ORDER BY Name LIMIT 5';
$result = mysqli_execute_query($link, $query, ['DEU']);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["District"]);
}

以上示例将输出类似于以下内容:

Aachen (Nordrhein-Westfalen)
Augsburg (Baijeri)
Bergisch Gladbach (Nordrhein-Westfalen)
Berlin (Berliini)
Bielefeld (Nordrhein-Westfalen)

参见

添加注释

用户贡献的注释 1 条注释

1
theking2(at)king(dot).co.
11 个月前
一个用于调用存储过程的函数,该函数可以接受任意数量的 IN 参数和一个 OUT 参数(例如,返回受影响的行数)。函数的返回值就是这个值。

<?php

/**
* call_sp 调用指定的存储过程及其参数。
* 第一个参数是存储过程的名称。
* 其余参数是存储过程的 (in) 参数。
* 最后一个 (out) 参数应该是一个整数,例如状态或受影响的行数。
*
* @param mixed $sp_name 要调用的存储过程的名称。
* @param mixed $params 传递给存储过程的参数。
* @return int 受影响的行数。
*/
function call_sp( \mysqli $db, string $sp_name, ...$params ): int
{
$sql = "CALL $sp_name( ";
$sql .= implode( ", ", array_fill( 0, count( $params ), "?" ) );
$sql .= ", @__affected );";

$result = $db->execute_query( $sql, $params );
$result = $db->query( "select @__affected;" );
$affected = (int) $result->fetch_column( 0 );
return
$affected;
}
To Top