(PHP 5, PHP 7, PHP 8)
mysqli::prepare -- mysqli_prepare — 準備執行一個(gè) SQL 語(yǔ)句
面向對象風(fēng)格
過(guò)程化風(fēng)格
做好執行 SQL 語(yǔ)句的準備,返回一個(gè)語(yǔ)句句柄,可以對這個(gè)句柄進(jìn)行后續的操作。 這里僅僅支持單一的 SQL 語(yǔ)句,不支持多 SQL 語(yǔ)句。
在執行語(yǔ)句之前,需要使用 mysqli_stmt_bind_param() 函數 對占位符參數進(jìn)行綁定。 同樣,在獲取結果之前,必須使用 mysqli_stmt_bind_result() 函數對返回的列值進(jìn)行綁定。
mysql
僅以過(guò)程化樣式:由mysqli_connect() 或 mysqli_init() 返回的 mysqli 對象。
query
SQL 語(yǔ)句。
注意:
不需要在語(yǔ)句末尾增加分號(;) 或者
\g
結束符。
SQL 語(yǔ)句中可以包含一個(gè)或者多個(gè)問(wèn)號(?
)
表示語(yǔ)句的參數。
注意:
SQL 語(yǔ)句中,僅允許在特定的位置出現問(wèn)號參數占位符。 例如,在
INSERT
語(yǔ)句中的VALUES()
子句中可以使用參數占位符,來(lái)表示對應列的值。 也可以在WHERE
字句中使用參數來(lái)表示 要進(jìn)行比較的值。但是,并不是所有的地方都允許使用參數占位符, 例如對于表名、列名這樣的 SQL 語(yǔ)句中的標識位置, 就不可以使用參數占位。
SELECT
語(yǔ)句中的列名就不可以使用參數。 另外,對于=
這樣的邏輯比較操作也不可以在兩側都使用參數, 否則服務(wù)器在解析 SQL 的時(shí)候就不知道該如何檢測參數類(lèi)型了。 也不可以在NULL
條件中使用問(wèn)號, 也就是說(shuō)不可以寫(xiě)成:? IS NULL
。 一般而言,參數也只能用在數據操作(DML)語(yǔ)句中, 不可以用在數據定義(DDL)語(yǔ)句中。
mysqli_prepare() 返回一個(gè) statement 對象,如果發(fā)生錯誤則返回 false
。
示例 #1 mysqli::prepare() 例程
面向對象風(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è)預編譯 SQL 語(yǔ)句 */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
/* 對于參數占位符進(jìn)行參數值綁定 */
$stmt->bind_param("s", $city);
/* 執行查詢(xún) */
$stmt->execute();
/* 將查詢(xún)結果綁定到變量 */
$stmt->bind_result($district);
/* 獲取查詢(xún)結果值 */
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);
/* 關(guān)于語(yǔ)句對象 */
$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è)預編譯 SQL 語(yǔ)句 */
if ($stmt = mysqli_prepare($link, "SELECT District FROM City WHERE Name=?")) {
/* 對于參數占位符進(jìn)行參數值綁定 */
mysqli_stmt_bind_param($stmt, "s", $city);
/* 執行查詢(xún) */
mysqli_stmt_execute($stmt);
/* 將查詢(xún)結果綁定到變量 */
mysqli_stmt_bind_result($stmt, $district);
/* 獲取查詢(xún)結果值 */
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