mysqli::prepare

mysqli_prepare

(PHP 5, PHP 7, PHP 8)

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() 函数对返回的列值进行绑定。

参数

mysql

仅以过程化样式:由mysqli_connect()mysqli_init() 返回的 mysqli 对象。

query

SQL 语句。

注意:

不需要在语句末尾增加分号(;) 或者 \g 结束符。

SQL 语句中可以包含一个或者多个问号(?) 表示语句的参数。

注意:

SQL 语句中,仅允许在特定的位置出现问号参数占位符。 例如,在 INSERT 语句中的 VALUES() 子句中可以使用参数占位符,来表示对应列的值。 也可以在 WHERE 字句中使用参数来表示 要进行比较的值。

但是,并不是所有的地方都允许使用参数占位符, 例如对于表名、列名这样的 SQL 语句中的标识位置, 就不可以使用参数占位。 SELECT 语句中的列名就不可以使用参数。 另外,对于 = 这样的逻辑比较操作也不可以在两侧都使用参数, 否则服务器在解析 SQL 的时候就不知道该如何检测参数类型了。 也不可以在 NULL 条件中使用问号, 也就是说不可以写成:? IS NULL。 一般而言,参数也只能用在数据操作(DML)语句中, 不可以用在数据定义(DDL)语句中。

返回值

mysqli_prepare() 返回一个 statement 对象,如果发生错误则返回 false

范例

示例 #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

参见