2024 日本 PHP 研討會

mysqli::execute_query

mysqli_execute_query

(PHP 8 >= 8.2.0)

mysqli::execute_query -- mysqli_execute_query準備、綁定參數並執行 SQL 陳述式

說明

物件導向風格

public mysqli::execute_query(字串 $query, ?陣列 $params = null): mysqli_result|布林值

程序式風格

mysqli_execute_query(mysqli $mysql, 字串 $query, ?陣列 $params = null): mysqli_result|布林值

準備 SQL 查詢、綁定參數並執行它。 mysqli::execute_query() 方法是 mysqli::prepare()mysqli_stmt::bind_param()mysqli_stmt::execute()mysqli_stmt::get_result() 的捷徑。

陳述式樣板可以包含零個或多個問號 (?) 參數標記,也稱為佔位符。必須使用 params 參數以 陣列 的形式提供參數值。

已準備好的陳述式是在幕後建立的,但它永遠不會暴露在函式之外。無法像使用 mysqli_stmt 物件那樣訪問陳述式的屬性。由於此限制,狀態資訊會複製到 mysqli 物件,並且可以使用其方法(例如 mysqli_affected_rows()mysqli_error())來取得。

注意事項:

如果傳遞給 mysqli_execute_query() 的陳述式長度超過伺服器的 max_allowed_packet,則根據作業系統的不同,返回的錯誤碼也會有所不同。其行為如下:

  • 在 Linux 上,返回錯誤碼 1153。錯誤訊息表示「收到的封包大於 max_allowed_packet 位元組」。

  • 在 Windows 上,返回錯誤碼 2006。此錯誤訊息表示「伺服器已斷線」。

參數

mysql

僅限程序式風格:由 mysqli_connect()mysqli_init() 返回的 mysqli 物件。

query

查詢,以字串表示。它必須由單個 SQL 陳述式組成。

SQL 陳述式可以包含零個或多個由問號 (?) 字元在適當位置表示的參數標記。

注意事項:

標記僅在 SQL 陳述式的特定位置合法。例如,它們允許在 INSERT 陳述式的 VALUES() 列表中(用於指定一列的欄位值),或在 WHERE 子句中與欄位的比較中用於指定比較值。但是,它們不允許用於識別碼(例如表格或欄位名稱)。

params

一個可選的 陣列 列表,其元素數量與正在執行的 SQL 陳述式中的繫結參數數量相同。每個值都被視為 字串

返回值

失敗時返回 false。對於產生結果集的成功查詢,例如 SELECT、SHOW、DESCRIBEEXPLAIN,返回一個 mysqli_result 物件。對於其他成功的查詢,返回 true

範例

範例 #1 mysqli::execute_query() 範例

物件導向風格

<?php

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

$query = 'SELECT Name, District FROM City WHERE CountryCode=? ORDER BY Name LIMIT 5';
$result = $mysqli->execute_query($query, ['DEU']);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["District"]);
}

程序式風格

<?php

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

$query = 'SELECT Name, District FROM City WHERE CountryCode=? ORDER BY Name LIMIT 5';
$result = mysqli_execute_query($link, $query, ['DEU']);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["District"]);
}

以上範例將輸出類似以下的內容:

Aachen (Nordrhein-Westfalen)
Augsburg (Baijeri)
Bergisch Gladbach (Nordrhein-Westfalen)
Berlin (Berliini)
Bielefeld (Nordrhein-Westfalen)

另請參閱

新增註記

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

theking2(at)king(dot).co.
11 個月前
一個函式,用於呼叫具有任意數量 IN 參數和一個 OUT 參數的預存程序,例如返回受影響的列數。 函式的返回值就是這個值。

<?php

/**
* call_sp 使用給定的參數呼叫指定的預存程序。
* 第一個參數是預存程序的名稱。
* 其餘參數是預存程序的 (in) 參數。
* 最後一個 (out) 參數應該是一個整數,例如狀態或受影響的列數。
*
* @param mixed $sp_name 要呼叫的預存程序的名稱。
* @param mixed $params 要傳遞給預存程序的參數。
* @return int 受影響的列數。
*/
function call_sp( \mysqli $db, string $sp_name, ...$params ): int
{
$sql = "CALL $sp_name( ";
$sql .= implode( ", ", array_fill( 0, count( $params ), "?" ) );
$sql .= ", @__affected );";

$result = $db->execute_query( $sql, $params );
$result = $db->query( "select @__affected;" );
$affected = (int) $result->fetch_column( 0 );
return
$affected;
}
To Top