2024 PHP Conference Japan

mysqli_stmt::execute

mysqli_stmt_execute

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::execute -- mysqli_stmt_execute執行預備語句

說明

物件導向風格

公開 mysqli_stmt::execute(?陣列 $params = null): 布林值

程序式風格

mysqli_stmt_execute(mysqli_stmt $statement, ?陣列 $params = null): 布林值

執行先前準備好的語句。語句必須在執行之前成功準備,可以使用 mysqli_prepare()mysqli_stmt_prepare() 函式,或者將第二個參數傳遞給 mysqli_stmt::__construct()

如果語句是 UPDATEDELETEINSERT,則可以使用 mysqli_stmt_affected_rows() 函式來確定受影響的總列數。如果查詢產生結果集,則可以使用 mysqli_stmt_get_result() 函式擷取,或者使用 mysqli_stmt_fetch() 函式直接從語句逐列擷取。

參數

statement

僅限程序式風格:由 mysqli_stmt_init() 返回的 mysqli_stmt 物件。

params

一個可選的 陣列 列表,其元素數量與正在執行的 SQL 語句中的綁定參數數量相同。每個值都被視為 字串

返回值

成功時返回 true,失敗時返回 false

錯誤/例外

如果啟用了 mysqli 錯誤報告 (MYSQLI_REPORT_ERROR) 且請求的操作失敗,則會產生警告。此外,如果模式設定為 MYSQLI_REPORT_STRICT,則會改為拋出 mysqli_sql_exception

更新日誌

版本 說明
8.1.0 已新增可選的 params 參數。

範例

範例 #1 執行帶有綁定變數的預備語句

物件導向風格

<?php

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

$mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City");

/* 準備一個插入語句 */
$stmt = $mysqli->prepare("INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)");

/* 將變數綁定到參數 */
$stmt->bind_param("sss", $val1, $val2, $val3);

$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';

/* 執行語句 */
$stmt->execute();

$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';

/* 執行語句 */
$stmt->execute();

/* 從 myCity 檢索所有列 */
$query = "SELECT Name, CountryCode, District FROM myCity";
$result = $mysqli->query($query);
while (
$row = $result->fetch_row()) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

程序式風格

<?php

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

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

/* 準備一個插入語句 */
$stmt = mysqli_prepare($link, "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)");

/* 將變數綁定到參數 */
mysqli_stmt_bind_param($stmt, "sss", $val1, $val2, $val3);

$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';

/* 執行語句 */
mysqli_stmt_execute($stmt);

$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';

/* 執行語句 */
mysqli_stmt_execute($stmt);

/* 從 myCity 檢索所有列 */
$query = "SELECT Name, CountryCode, District FROM myCity";
$result = mysqli_query($link, $query);
while (
$row = mysqli_fetch_row($result)) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

以上範例會輸出

Stuttgart (DEU,Baden-Wuerttemberg)
Bordeaux (FRA,Aquitaine)

範例 #2 使用值陣列執行預備語句

物件導向風格

<?php

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

$mysqli->query('CREATE TEMPORARY TABLE myCity LIKE City');

/* 準備一個插入語句 */
$stmt = $mysqli->prepare('INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)');

/* 執行語句 */
$stmt->execute(['Stuttgart', 'DEU', 'Baden-Wuerttemberg']);

/* 從 myCity 檢索所有資料列 */
$query = 'SELECT Name, CountryCode, District FROM myCity';
$result = $mysqli->query($query);
while (
$row = $result->fetch_row()) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

程序式風格

<?php

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

mysqli_query($link, 'CREATE TEMPORARY TABLE myCity LIKE City');

/* 準備一個插入語句 */
$stmt = mysqli_prepare($link, 'INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)');

/* 執行語句 */
mysqli_stmt_execute($stmt, ['Stuttgart', 'DEU', 'Baden-Wuerttemberg']);

/* 從 myCity 檢索所有列 */
$query = 'SELECT Name, CountryCode, District FROM myCity';
$result = mysqli_query($link, $query);
while (
$row = mysqli_fetch_row($result)) {
printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
}

以上範例會輸出

Stuttgart (DEU,Baden-Wuerttemberg)

另請參閱

新增註釋

使用者貢獻的筆記 1 則筆記

Typer85 at gmail dot com
17 年前
僅針對手冊中關於此函式的說明做一些澄清

「注意:使用 mysqli_stmt_execute() 時,必須先使用 mysqli_stmt_fetch() 函式擷取資料,才能執行任何其他查詢。」

這是因為此函式「不會」將結果集儲存在用戶端,因此您必須擷取結果集中的所有內容,否則可能會發生嚴重錯誤。

然而,如果您在此函式之後立即使用 mysqli_stmt_store_result 函式,則會強制將結果集儲存在用戶端,因此在擷取所有資料之前發出額外的查詢是安全的。

這時您必須根據應用程式的優先順序做出選擇。如果您知道結果集很大,那麼最好不要將其儲存在用戶端,以免伺服器記憶體不足而發生錯誤。但這也意味著您不會對結果集進行大量計算,否則在您擷取所有資料之前,將會阻止任何其他程式使用結果集來源的表格。

如果您要進行大量計算,或者結果集不大,最好將其儲存在用戶端。

如果您的伺服器上有大量可用記憶體,大多數這些問題都可以輕鬆解決,但對於共享主機上的使用者來說,情況通常並非如此。

如果您使用的是共享主機,解決此問題的明智方法是巧妙地設計查詢。如果您知道將會擷取大量的結果集,請嘗試限制結果集的大小。

針對您的應用程式測試不同的替代方案,看看在不同情況下哪種方法最有效。

祝好運,
To Top