mysqli::prepare

mysqli_prepare

(PHP 5, PHP 7, PHP 8)

mysqli::prepare -- mysqli_prepare準(zhǔn)備執(zhí)行一個(gè) SQL 語(yǔ)句

說(shuō)明

面向?qū)ο箫L(fēng)格

mysqli::prepare(string $query): mysqli_stmt

過(guò)程化風(fēng)格

mysqli_prepare(mysqli $link, string $query): mysqli_stmt

做好執(zhí)行 SQL 語(yǔ)句的準(zhǔn)備,返回一個(gè)語(yǔ)句句柄,可以對(duì)這個(gè)句柄進(jìn)行后續(xù)的操作。 這里僅僅支持單一的 SQL 語(yǔ)句,不支持多 SQL 語(yǔ)句。

在執(zhí)行語(yǔ)句之前,需要使用 mysqli_stmt_bind_param() 函數(shù) 對(duì)占位符參數(shù)進(jìn)行綁定。 同樣,在獲取結(jié)果之前,必須使用 mysqli_stmt_bind_result() 函數(shù)對(duì)返回的列值進(jìn)行綁定。

參數(shù)

mysql

僅以過(guò)程化樣式:由mysqli_connect()mysqli_init() 返回的 mysqli 對(duì)象。

query

SQL 語(yǔ)句。

注意:

不需要在語(yǔ)句末尾增加分號(hào)(;) 或者 \g 結(jié)束符。

SQL 語(yǔ)句中可以包含一個(gè)或者多個(gè)問(wèn)號(hào)(?) 表示語(yǔ)句的參數(shù)。

注意:

SQL 語(yǔ)句中,僅允許在特定的位置出現(xiàn)問(wèn)號(hào)參數(shù)占位符。 例如,在 INSERT 語(yǔ)句中的 VALUES() 子句中可以使用參數(shù)占位符,來(lái)表示對(duì)應(yīng)列的值。 也可以在 WHERE 字句中使用參數(shù)來(lái)表示 要進(jìn)行比較的值。

但是,并不是所有的地方都允許使用參數(shù)占位符, 例如對(duì)于表名、列名這樣的 SQL 語(yǔ)句中的標(biāo)識(shí)位置, 就不可以使用參數(shù)占位。 SELECT 語(yǔ)句中的列名就不可以使用參數(shù)。 另外,對(duì)于 = 這樣的邏輯比較操作也不可以在兩側(cè)都使用參數(shù), 否則服務(wù)器在解析 SQL 的時(shí)候就不知道該如何檢測(cè)參數(shù)類型了。 也不可以在 NULL 條件中使用問(wèn)號(hào), 也就是說(shuō)不可以寫(xiě)成:? IS NULL。 一般而言,參數(shù)也只能用在數(shù)據(jù)操作(DML)語(yǔ)句中, 不可以用在數(shù)據(jù)定義(DDL)語(yǔ)句中。

返回值

mysqli_prepare() 返回一個(gè) statement 對(duì)象,如果發(fā)生錯(cuò)誤則返回 false

范例

示例 #1 mysqli::prepare() 例程

面向?qū)ο箫L(fēng)格

<?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";

/* 創(chuàng)建一個(gè)預(yù)編譯 SQL 語(yǔ)句 */
if ($stmt $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    
/* 對(duì)于參數(shù)占位符進(jìn)行參數(shù)值綁定 */
    
$stmt->bind_param("s"$city);

    
/* 執(zhí)行查詢 */
    
$stmt->execute();

    
/* 將查詢結(jié)果綁定到變量 */
    
$stmt->bind_result($district);

    
/* 獲取查詢結(jié)果值 */
    
$stmt->fetch();

    
printf("%s is in district %s\n"$city$district);

    
/* 關(guān)于語(yǔ)句對(duì)象 */
    
$stmt->close();
}

/* 關(guān)閉連接 */
$mysqli->close();
?>

過(guò)程化風(fēng)格

<?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";

/* 創(chuàng)建一個(gè)預(yù)編譯 SQL 語(yǔ)句 */
if ($stmt mysqli_prepare($link"SELECT District FROM City WHERE Name=?")) {

    
/* 對(duì)于參數(shù)占位符進(jìn)行參數(shù)值綁定 */
    
mysqli_stmt_bind_param($stmt"s"$city);

    
/* 執(zhí)行查詢 */
    
mysqli_stmt_execute($stmt);

    
/* 將查詢結(jié)果綁定到變量 */
    
mysqli_stmt_bind_result($stmt$district);

    
/* 獲取查詢結(jié)果值 */
    
mysqli_stmt_fetch($stmt);

    
printf("%s is in district %s\n"$city$district);

    
/* 關(guān)閉語(yǔ)句句柄 */
    
mysqli_stmt_close($stmt);
}

/* 關(guān)閉連接 */
mysqli_close($link);
?>

以上例程會(huì)輸出:

Amersfoort is in district Utrecht

參見(jiàn)