Php/docs/mysqli.prepare
mysqli::prepare
mysqli_prepare
(PHP 5, PHP 7)
mysqli::prepare -- mysqli_prepare — 准备执行一个 SQL 语句
说明
面向对象风格
mysqli::prepare
( string $query
) : mysqli_stmt
过程化风格
mysqli_prepare
( mysqli $link
, string $query
) : mysqli_stmt
做好执行 SQL 语句的准备,返回一个语句句柄,可以对这个句柄进行后续的操作。 这里仅仅支持单一的 SQL 语句,不支持多 SQL 语句。
在执行语句之前,需要使用 mysqli_stmt_bind_param() 函数 对占位符参数进行绑定。 同样,在获取结果之前,必须使用 mysqli_stmt_bind_result() 函数对返回的列值进行绑定。
参数
link
仅以过程化样式:由mysqli_connect() 或 mysqli_init() 返回的链接标识。
query
SQL 语句。
Note:
不需要在语句末尾增加分号(;) 或者
\g
结束符。SQL 语句中可以包含一个或者多个问号(
?
) 表示语句的参数。Note:
SQL 语句中,仅允许在特定的位置出现问号参数占位符。 例如,在
INSERT
语句中的VALUES()
子句中可以使用参数占位符,来表示对应列的值。 也可以在WHERE
字句中使用参数来表示 要进行比较的值。但是,并不是所有的地方都允许使用参数占位符, 例如对于表名、列名这样的 SQL 语句中的标识位置, 就不可以使用参数占位。
SELECT
语句中的列名就不可以使用参数。 另外,对于=
这样的逻辑比较操作也不可以在两侧都使用参数, 否则服务器在解析 SQL 的时候就不知道该如何检测参数类型了。 也不可以在NULL
条件中使用问号, 也就是说不可以写成:? IS NULL
。 一般而言,参数也只能用在数据操作(DML)语句中, 不可以用在数据定义(DDL)语句中。
返回值
mysqli_prepare() 返回一个 statement 对象,如果发生错误则返回 false
。
范例
Example #1 mysqli::prepare() 例程
面向对象风格
<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");/* 检查连接 */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}$city = "Amersfoort";/* 创建一个预编译 SQL 语句 */if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { /* 对于参数占位符进行参数值绑定 */ $stmt->bind_param("s", $city); /* 执行查询 */ $stmt->execute(); /* 将查询结果绑定到变量 */ $stmt->bind_result($district); /* 获取查询结果值 */ $stmt->fetch(); printf("%s is in district %s\n", $city, $district); /* 关于语句对象 */ $stmt->close();}/* 关闭连接 */$mysqli->close();?>
过程化风格
<?php$link = mysqli_connect("localhost", "my_user", "my_password", "world");/* 检查连接 */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}$city = "Amersfoort";/* 创建一个预编译 SQL 语句 */if ($stmt = mysqli_prepare($link, "SELECT District FROM City WHERE Name=?")) { /* 对于参数占位符进行参数值绑定 */ mysqli_stmt_bind_param($stmt, "s", $city); /* 执行查询 */ mysqli_stmt_execute($stmt); /* 将查询结果绑定到变量 */ mysqli_stmt_bind_result($stmt, $district); /* 获取查询结果值 */ mysqli_stmt_fetch($stmt); printf("%s is in district %s\n", $city, $district); /* 关闭语句句柄 */ mysqli_stmt_close($stmt);}/* 关闭连接 */mysqli_close($link);?>
以上例程会输出:
Amersfoort is in district Utrecht
参见
- mysqli_stmt_execute() - Executes a prepared Query
- mysqli_stmt_fetch() - Fetch results from a prepared statement into the bound variables
- mysqli_stmt_bind_param() - Binds variables to a prepared statement as parameters
- mysqli_stmt_bind_result() - Binds variables to a prepared statement for result storage
- mysqli_stmt_close() - Closes a prepared statement