PHP 日本研討會 2024

mysql_error

(PHP 4, PHP 5)

mysql_error傳回前一個 MySQL 操作的錯誤訊息文字

警告

此擴充功能已在 PHP 5.5.0 中棄用,並在 PHP 7.0.0 中移除。應改用 MySQLiPDO_MySQL 擴充功能。另請參閱 MySQL:選擇 API 指南。此函式的替代方案包括

說明

mysql_error(resource $link_identifier = NULL): string

傳回上次 MySQL 函式的錯誤文字。從 MySQL 資料庫後端傳回的錯誤不再發出警告。相反地,請使用 mysql_error() 來擷取錯誤文字。請注意,此函式僅傳回最近執行的 MySQL 函式 (不包括 mysql_error()mysql_errno()) 的錯誤文字,因此如果您要使用它,請確保在呼叫另一個 MySQL 函式之前檢查其值。

參數

link_identifier

MySQL 連線。如果未指定連結識別符,則會假設為 mysql_connect() 開啟的最後一個連結。如果找不到此類連結,則會嘗試建立一個,就好像呼叫了不帶任何參數的 mysql_connect() 一樣。如果找不到或建立連線,則會產生 E_WARNING 等級的錯誤。

傳回值

傳回上次 MySQL 函式的錯誤文字,如果沒有錯誤發生,則傳回 ''(空字串)。

範例

範例 #1 mysql_error() 範例

<?php
$link
= mysql_connect("localhost", "mysql_user", "mysql_password");

mysql_select_db("nonexistentdb", $link);
echo
mysql_errno($link) . ": " . mysql_error($link). "\n";

mysql_select_db("kossu", $link);
mysql_query("SELECT * FROM nonexistenttable", $link);
echo
mysql_errno($link) . ": " . mysql_error($link) . "\n";
?>

上述範例會輸出類似以下的內容

1049: Unknown database 'nonexistentdb'
1146: Table 'kossu.nonexistenttable' doesn't exist

參見

新增註解

使用者貢獻的註解 13 則註解

9
aleczapka _at) gmx dot net
20 年前
如果您想要顯示類似「存取遭拒...」之類的錯誤,當 mysql_error() 傳回 "" 且 mysql_errno() 傳回 0 時,請使用 $php_errormsg。此警告會儲存在那裡。您需要在 php.ini 中將 track_errors 設定為 true。

注意。關於 error_reporting() 的文件或 mysql_error() 函式中存在錯誤,因為 mysql_error() 的手冊說:「從 MySQL 資料庫後端傳回的錯誤不再發出警告。」這是不正確的。
4
l dot poot at twing dot nl
18 年前
在建立大型應用程式時,建立一個自訂函式來處理查詢非常方便。只需在每個腳本中包含此函式。並使用 db_query(在此範例中)代替 mysql_query。

此範例會在 debugmode (變數 $b_debugmode) 中提示錯誤。否則,會將包含錯誤的電子郵件傳送給網站管理員。

腳本也會在目錄中 (在此範例中為 /log) 寫入記錄檔。

當資料庫/查詢資訊提示給訪客時,系統會很脆弱。因此請務必隨時向訪客隱藏此資訊。

問候,

Lennart Poot
http://www.twing.nl

<?php
$b_debugmode
= 1; // 0 || 1

$system_operator_mail = 'developer@company.com';
$system_from_mail = 'info@mywebsite.com';

function
db_query( $query ){
global
$b_debugmode;

// 執行查詢
$result = mysql_query($query);

// 檢查結果
// 這會顯示實際發送到 MySQL 的查詢語句和錯誤訊息。對除錯很有用。
if (!$result) {
if(
$b_debugmode){
$message = '<b>無效的查詢:</b><br>' . mysql_error() . '<br><br>';
$message .= '<b>完整查詢語句:</b><br>' . $query . '<br><br>';
die(
$message);
}

raise_error('db_query_error: ' . $message);
}
return
$result;
}

function
raise_error( $message ){
global
$system_operator_mail, $system_from_mail;

$serror=
"Env: " . $_SERVER['SERVER_NAME'] . "\r\n" .
"timestamp: " . Date('m/d/Y H:i:s') . "\r\n" .
"script: " . $_SERVER['PHP_SELF'] . "\r\n" .
"error: " . $message ."\r\n\r\n";

// 開啟記錄檔並寫入錯誤訊息
$fhandle = fopen( '/logs/errors'.date('Ymd').'.txt', 'a' );
if(
$fhandle){
fwrite( $fhandle, $serror );
fclose(( $fhandle ));
}

// 發送錯誤訊息電子郵件給系統管理員
if(!$b_debugmode)
mail($system_operator_mail, 'error: '.$message, $serror, 'From: ' . $system_from_mail );
}

?>
2
Florian Sidler
14 年前
請注意,如果您使用多個 MySQL 連線,您必須支援 `mysql_error()` 函式的連結識別符。否則您的錯誤訊息將會是空白的。

我剛花了 30 分鐘才弄清楚為什麼我看不到我的 SQL 錯誤。
1
Pendragon Castle
15 年前
我修改了 josh ><>'s 的函式,建立了以下函式。它的目的是使用資料庫來儲存錯誤。它可以處理原始的查詢以及錯誤記錄。同時也包含了 Larry Ullman 的 `escape_data()`,因為我在 `q()` 中使用了它。

<?php
function escape_data($data){
global
$dbc;
if(
ini_get('magic_quotes_gpc')){
$data=stripslashes($data);
}
return
mysql_real_escape_string(trim($data),$dbc);
}

function
q($page,$query){
// $page
$result = mysql_query($query);
if (
mysql_errno()) {
$error = "MySQL 錯誤 ".mysql_errno().": ".mysql_error()."\n<br>執行時:<br>\n$query\n<br>";
$log = mysql_query("INSERT INTO db_errors (error_page,error_text) VALUES ('$page','".escape_data($error)."')");
}
}

// 使用 q() 執行查詢
$query = "INSERT INTO names (first, last) VALUES ('myfirst', 'mylast'");
$result = q("範例頁面標題",$query);
?>
-1
olaf at amen-online dot de
20 年前
在處理使用者輸入時,請確保您使用
<?php
echo htmlspecialchars (mysql_error ());
?>
而不是
<?php
echo mysql_error ();
?>

否則,可能會有人提交導致 SQL 查詢失敗且包含 JavaScript 命令的資料,藉此入侵您的系統。

是否應該相應地修改 `mysql_query()` 和 `mysql_error()` 文件中的範例?
-2
Anonymous
23 年前
有些錯誤無法處理。範例:

錯誤 1044:使用者 'ituser@mail.ramon.intranet' 無權存取資料庫 'itcom'

當未授權的使用者嘗試執行 SQL 插入時會發生此錯誤。結果:`mysql_errno = 0` 且 `mysql_error = ""`。
-3
Anonymous
19 年前
我建議的 `mysql_error()` 實作方式:

`$result = mysql_query($query) or die("<b>發生嚴重的 MySQL 錯誤</b>。\n<br />查詢語句:" . $query . "<br />\n錯誤訊息:(" . mysql_errno() . ") " . mysql_error());`

這會印出類似以下內容:

發生嚴重的 MySQL 錯誤。
查詢語句:SELECT * FROM table
錯誤訊息:(err_no) 叭啦叭啦,你全都做錯了

查看您的查詢語句以便偵測語法問題非常有用。通常,MySQL 的輸出訊息不會在錯誤訊息中顯示足夠的查詢語句,讓您看到查詢語句哪裡出錯了 - 可能是遺漏了引號、逗號或 ( 或 ),這些錯誤可能在偵測到錯誤之前就已經發生了。然而,我*不*建議對您網站上執行的、非使用者特定的查詢使用此程序,因為它有可能洩漏敏感資料。建議僅將其用於除錯/建構腳本,以及用於一般的使用者特定查詢,最糟的情況是將使用者自己的資訊洩漏給他們自己。

祝您好運,

-Scott
-3
scott at rocketpack dot net
21 年前
我建議的 `mysql_error()` 實作方式:

`$result = mysql_query($query) or die("<b>發生嚴重的 MySQL 錯誤</b>。\n<br />查詢語句:" . $query . "<br />\n錯誤訊息:(" . mysql_errno() . ") " . mysql_error());`

這會印出類似以下內容:

<b>發生嚴重的 MySQL 錯誤</b>。
查詢語句:SELECT * FROM table
錯誤訊息:(err_no) 叭啦叭啦,你全都做錯了

查看您的查詢語句以便偵測語法問題非常有用。通常,MySQL 的輸出訊息不會在錯誤訊息中顯示足夠的查詢語句,讓您看到查詢語句哪裡出錯了 - 可能是遺漏了引號、逗號或 ( 或 ),這些錯誤可能在偵測到錯誤之前就已經發生了。然而,我*不*建議對您網站上執行的、非使用者特定的查詢使用此程序,因為它有可能洩漏敏感資料。建議僅將其用於除錯/建構腳本,以及用於一般的使用者特定查詢,最糟的情況是將使用者自己的資訊洩漏給他們自己。

祝您好運,

-Scott
-4
josh ><>
21 年前
糟糕,我之前的文章中的程式碼僅適用於不傳回資料的查詢(INSERT、UPDATE、DELETE 等),這個更新的函式應該適用於所有類型的查詢(使用 `$result = myquery($query);`):

function myquery ($query) {
$result = mysql_query($query);
if (mysql_errno())
echo "MySQL 錯誤 ".mysql_errno().": ".mysql_error()."\n<br>執行時:<br>\n$query\n<br>";
return $result;
}
-4
Gianluigi_Zanettini-MegaLab.it
17 年前
我的朋友提出了一個很棒的解決方案。

<?php
$old_track
= ini_set('track_errors', '1');

.....

if (
$this->db_handle!=FALSE && $db_selection_status!=FALSE)
{
$this->connected=1;
ini_set('track_errors', $old_track);
}
else
{
$this->connected=-1;
$mysql_warning=$php_errormsg;
ini_set('track_errors', $old_track);
throw new
mysql_cns_exception(1, $mysql_warning . " " . mysql_error());
}
?>
-5
Gianluigi_Zanettini-MegaLab.it
17 年前
「來自 MySQL 資料庫後端的錯誤不再發出警告。」請注意,這裡有一個錯誤/臭蟲。事實上,MySQL 5.1搭配 PHP 5.2

Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL server host 'locallllllhost' (11001)

這是一個警告,而 mysql_error() 無法捕獲它!
-5
phpnet at robzazueta dot com
17 年前
這是一個很大的問題 - 從 MySQL 4.1 及以上版本開始,密碼雜湊的方式顯然已更改。PHP 4.x 與此變更不相容,但 PHP 5.0 相容。我仍然因為各種相容性原因而使用 4.x 系列,因此當我在執行 PHP 4.4.4 的 IIS 6.0 上設定 MySQL 5.0.x 時,我很驚訝地從 mysql_error() 收到此錯誤

MYSQL: Client does not support authentication protocol requested by server; consider upgrading MySQL client

根據 MySQL 網站 (https://mysqldev.dev.org.tw/doc/refman/5.0/en/old-client.html) ,最好的解決方法是對您的 mysql 資料庫使用者使用 OLD_PASSWORD() 函數。您可以透過向 MySQL 發出以下指令來重設它

Set PASSWORD for 'user'@'host' = OLD_PASSWORD('password');

這救了我一命。
-5
miko_il AT yahoo DOT com
20 年前
以下是當您從任何主機語言呼叫 MySQL 時可能出現的錯誤代碼

https://mysql.dev.org.tw/doc/en/Error-returns.html
To Top