PHP Conference Japan 2024

mysqli::$error

mysqli_error

(PHP 5, PHP 7, PHP 8)

mysqli::$error -- mysqli_error返回最後一個錯誤的字串描述

描述

物件導向風格

程序式風格

mysqli_error(mysqli $mysql): 字串

返回最近一次可能成功或失敗的 MySQLi 函式呼叫的最後一個錯誤訊息。

參數

mysql

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

傳回值

描述錯誤的字串。如果沒有發生錯誤,則為空字串。

範例

範例 #1 $mysqli->error 範例

物件導向風格

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

/* 檢查連線 */
if ($mysqli->connect_errno) {
printf("連線失敗: %s\n", $mysqli->connect_error);
exit();
}

if (!
$mysqli->query("SET a=1")) {
printf("錯誤訊息: %s\n", $mysqli->error);
}

/* 關閉連線 */
$mysqli->close();
?>

程序式風格

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* 檢查連線 */
if (mysqli_connect_errno()) {
printf("連線失敗: %s\n", mysqli_connect_error());
exit();
}

if (!
mysqli_query($link, "SET a=1")) {
printf("錯誤訊息: %s\n", mysqli_error($link));
}

/* 關閉連線 */
mysqli_close($link);
?>

以上範例將輸出

Error message: Unknown system variable 'a'

參見

新增註釋

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

information at saunderswebsolutions dot com
18 年前
PHP 5.05 無法使用 mysqli_sql_exception 類別

我使用以下程式碼來捕捉錯誤
<?php
$query
= "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);

if (!
$res) {
printf("Errormessage: %s\n", $mysqli->error);
}

?>
這個方法的問題在於 $res 的有效值為:mysqli_result 物件、true 或 false
這並不能告訴我們 SQL 語法發生錯誤。
如果您傳遞更新語句,如果更新失敗,false 是一個有效結果。

因此,更好的方法是
<?php
$query
= "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);

if (!empty(
$mysqli->error)) {
printf("錯誤訊息:%s\n", $mysqli->error);
}

?>

這會輸出類似以下的訊息
未預期的 PHP 錯誤 [mysqli::query() [<a href='function.query'>function.query</a>]: (42S22/1054): 'field list' 中的欄位 'XXname' 不明] 嚴重性 [E_WARNING] 位於 [G:\database.php] 的 [249] 行

非常令人沮喪,因為我還想捕捉 SQL 錯誤並印出堆疊追蹤。

更好的方法是

<?php
mysqli_report
(MYSQLI_REPORT_OFF); //關閉惱人的預設訊息

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT XXname FROM customer_table ";
$res = $mysqli->query($query);

if (
$mysqli->error) {
try {
throw new
Exception("MySQL 錯誤 $mysqli->error <br> 查詢:<br> $query", $msqli->errno);
} catch(
Exception $e ) {
echo
"錯誤代碼: ".$e->getCode(). " - ".$e->getMessage() . "<br >";
echo
nl2br($e->getTraceAsString());
}
}

//處理結果
?>
會印出類似以下的內容
錯誤代碼: 1054
欄位清單中找不到 'XXname' 欄位
查詢
SELECT XXname FROM customer_table

#0 G:\\database.php(251): database->dbError('欄位清單中找不到 ...', 1054, 'getQuery()', 'SELECT XXname F...')
#1 G:\data\WorkSites\1framework5\tests\dbtest.php(29): database->getString('SELECT XXname F...')
#2 c:\PHP\includes\simpletest\runner.php(58): testOfDB->testGetVal()
#3 c:\PHP\includes\simpletest\runner.php(96): SimpleInvoker->invoke('testGetVal')
#4 c:\PHP\includes\simpletest\runner.php(125): SimpleInvokerDecorator->invoke('testGetVal')
#5 c:\PHP\includes\simpletest\runner.php(183): SimpleErrorTrappingInvoker->invoke('testGetVal')
#6 c:\PHP\includes\simpletest\simple_test.php(90): SimpleRunner->run()
#7 c:\PHP\includes\simpletest\simple_test.php(498): SimpleTestCase->run(Object(HtmlReporter))
#8 c:\PHP\includes\simpletest\simple_test.php(500): GroupTest->run(Object(HtmlReporter))
#9 G:\all_tests.php(16): GroupTest->run(Object(HtmlReporter))

這實際上會印出錯誤、堆疊追蹤和有問題的 SQL 陳述式。當 SQL 陳述式是在程式碼的其他地方產生時,這會更有幫助。
se (at) brainbits (dot) net
18 年前
描述「mysqli_error -- 傳回最後一個錯誤的字串描述」並不完全是您從 mysqli_error 獲得的結果。您會得到最後一個 mysqli 函式的錯誤描述,而不是最後一個 mysql 錯誤的描述。

如果您遇到以下情況

if (!$mysqli->query("SET a=1")) {
$mysqli->query("ROLLBACK;")
printf("錯誤訊息: %s\n", $mysqli->error);
}

如果 ROLLBACK 查詢也沒有失敗,您將不會收到錯誤訊息。為了獲得正確的錯誤訊息,您必須寫入

if (!$mysqli->query("SET a=1")) {
printf("錯誤訊息: %s\n", $mysqli->error);
$mysqli->query("ROLLBACK;")
}
callforeach at gmail dot com
9 年前
我必須在我的程式碼開頭設定 mysqli_report(MYSQLI_REPORT_ALL) 才能在我的 php 程式碼的 catch 區塊中捕捉 mysqli 錯誤。

最初,我使用以下程式碼來拋出並隨後捕捉 mysqli 例外

<?php
try {
$mysqli = new mysqli('localhost','root','pwd','db');
if (
$mysqli->connect_errno)
throw new
Exception($mysqli->connect_error);

} catch (
Exception $e) {
echo
$e->getMessage();
}

我發現異常在實際的 throw 陳述式之前就被拋出了,因此 catch 區塊沒有被呼叫到。

我目前的程式碼如下:
mysqli_report
(MYSQLI_REPORT_ALL) ;
try {
$mysqli = new mysqli('localhost','root','pwd','db');
/* 我不需要拋出異常,它會自動拋出 */

} catch (Exception $e) {
echo
$e->getMessage();
}

這樣可以正常運作,而且我可以捕捉所有 mysqli 錯誤。
asmith16 at littlesvr dot ca
11 年前
請注意,返回的字串可能包含最初由使用者提供的資料,這可能會使您的程式碼容易受到 XSS 攻擊。

因此,即使您使用 mysqli_real_escape_string() 對 SQL 查詢中的所有內容進行跳脫處理,如果您打算顯示 mysqli_error() 返回的字串,也請確保透過 htmlspecialchars() 對該字串進行處理。

據我所知,這兩個跳脫函式不會跳脫相同的字元,這就是為什麼您需要同時使用這兩個函式(第一個用於 SQL,第二個用於 HTML/JS)。
abderrahmanekaddour dot aissat at gmail dot com
2 年前
<?php

// 主要目的是為了方便開發者偵錯,加入格式化的錯誤資訊。

$myfile = fopen("database_log.log", "r");
$db = new mysqli("localhost", "root","root","data");
if( !
$db->query("SELECT")){
$timestamp = new DateTime();
$data_err = " {
\"title\": \" Select 語句錯誤 \",
\"date_time\": "
.$timestamp->getTimestamp().",
\"error\":\" "
.$db->error." \"
} "
; // 加入更多資訊
fwrite($myfile, $data_err); // 寫入資料
}
// 在另一個檔案中讀取檔案並格式化以獲得良好的視覺效果。

$db->close();
fclose($myfile);
?>
To Top