2024 年 PHP 日本會議

mysqli::$info

mysqli_info

(PHP 5, PHP 7, PHP 8)

mysqli::$info -- mysqli_info擷取關於最近執行查詢的資訊

說明

物件導向風格

程序式風格

mysqli_info(mysqli $mysql): ?字串

mysqli_info() 函式會傳回一個字串,提供關於上次執行查詢的資訊。這個字串的組成說明如下:

可能的 mysqli_info 回傳值
查詢類型 範例結果字串
INSERT INTO...SELECT... 紀錄數:100,重複數:0,警告數:0
INSERT INTO...VALUES (...),(...),(...) 紀錄數:3,重複數:0,警告數:0
LOAD DATA INFILE ... 紀錄數:1,刪除數:0,略過數:0,警告數:0
ALTER TABLE ... 紀錄數:3,重複數:0,警告數:0
UPDATE ... 符合列數:40,變更數:40,警告數:0

注意:

不屬於上述格式的查詢不受支援。在這些情況下,mysqli_info() 會傳回空字串。

參數

mysql

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

回傳值

表示最近執行查詢之額外資訊的字串。

範例

範例 #1 $mysqli->info 範例

物件導向風格

<?php

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

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

/* INSERT INTO ... SELECT */
$mysqli->query("INSERT INTO t1 SELECT * FROM City ORDER BY ID LIMIT 150");
printf("%s\n", $mysqli->info);

程序式風格

<?php

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

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

/* INSERT INTO ... SELECT */
mysqli_query($link, "INSERT INTO t1 SELECT * FROM City ORDER BY ID LIMIT 150");
printf("%s\n", mysqli_info($link));

上述範例將輸出:

Records: 150  Duplicates: 0  Warnings: 0

另請參閱

新增註釋

使用者貢獻的註釋 3 則註釋

user at biglake dot com
13 年前
或許可以幫人省點時間…

<?php
$prototype
='Rows matched: 0 Changed: 1 Warnings: 2';
list(
$matched, $changed, $warnings) = sscanf($prototype, "Rows matched: %d Changed: %d Warnings: %d");
?>
Rumour
5 個月前
我不記得我從哪裡得到這個資訊,但這是超級重要的資訊,我不敢相信文件中竟然沒有!

如果您在執行「INSERT INTO ... VALUES ()」僅新增/更新一列資料後執行 mysqli_info()/$mysqli->info(),則 mysqli::info() 會傳回空結果 (!!!)。

如果它是空的(在 PHP 8+ 上為 null;在 PHP 7 中我不知道它是以何種方式呈現空值),請檢查 $mysqli->affectedRows() 或 mysqli_affected_rows()。如果它傳回 2,則 INSERT 成功更新了一筆記錄(所以一定有 ON DUPLICATE KEY UPDATE)。如果它傳回 1:則插入了一筆記錄。

這不是錯誤,這是設計使然,雖然它確實讓我想起 90 年代微軟的「這不是錯誤,這是一個功能」。除了某些奇怪且極為舊的向下相容性問題外,我不知道為什麼要這樣設計。
vzverev [at] newmail.ru (Vasiliy Zverev)
7 年前
如果只插入一列資料,mysqli_info() 會傳回空字串,這可能會造成混淆,但在這種情況下,mysqli_affected_rows() 會傳回 1。
To Top