PHP Conference Japan 2024

pg_last_error

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_last_error取得連線的最後一個錯誤訊息字串

說明

pg_last_error(?PgSql\Connection $connection = null): 字串

pg_last_error() 會傳回指定 connection 的最後一條錯誤訊息。

錯誤訊息可能會被內部的 PostgreSQL (libpq) 函式呼叫覆蓋。如果在 PostgreSQL 模組函式內發生多個錯誤,它可能不會傳回適當的錯誤訊息。

建議使用 pg_result_error()pg_result_error_field()pg_result_status()pg_connection_status() 進行更好的錯誤處理。

備註:

此函式以前稱為 pg_errormessage()

參數

connection

一個 PgSql\Connection 實例。當 connectionnull 時,將使用預設連線。預設連線是 pg_connect()pg_pconnect() 建立的最後一個連線。

警告

從 PHP 8.1.0 開始,不建議使用預設連線。

傳回值

一個 字串,包含指定 connection 的最後一條錯誤訊息。

更新日誌

版本 說明
8.1.0 connection 參數現在需要一個 PgSql\Connection 實例;以前需要的是一個資源
8.0.0 connection 現在可以為 null。

範例

範例 #1 pg_last_error() 範例

<?php
$dbconn
= pg_connect("dbname=publisher") or die("無法連線");

// 失敗的查詢
$res = pg_query($dbconn, "select * from doesnotexist");

echo
pg_last_error($dbconn);
?>

參見

新增註釋

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

5
Tamas Bolner
14 年前
從實務的角度來看,使用交易時有兩種類型的錯誤訊息

-「一般」錯誤:在這種情況下,應用程式應停止目前的處理程序,並向使用者顯示錯誤訊息。

-死結錯誤。這表示 PostgreSQL 的死結偵測程序發現了一個循環依賴關係,並透過回滾其中一個程序中的交易來打破它,該程序會收到此錯誤訊息。在這種情況下,應用程式不應停止,而應重複執行交易。

我沒有找到任何明確的方法來判斷我們正在處理哪種情況。此介面不支援錯誤碼,因此我們必須在訊息文字中搜尋模式。

以下是一個 PostgreSQL 資料庫連線類別的範例。它會在「一般」錯誤時拋出 PostgresException,在發生死結且需要重複交易時拋出 DependencyException。

postgres.php
<?php
class PostgresException extends Exception {
function
__construct($msg) { parent::__construct($msg); }
}

class
DependencyException extends PostgresException {
function
__construct() { parent::__construct("死結"); }
}

class
pg {
public static
$connection;

private static function
connect() {
self::$connection = @pg_connect("dbname=foodb user=foouser password=foopasswd");
if (
self::$connection === FALSE) {
throw(new
PostgresException("無法連線到資料庫伺服器。"));
}
}

public static function
query($sql) {
if (!isset(
self::$connection)) {
self::connect();
}

$result = @pg_query(self::$connection, $sql);
if (
$result === FALSE) {
$error = pg_last_error(self::$connection);
if (
stripos($error, "deadlock detected") !== false) throw(new DependencyException());

throw(new
PostgresException($error.": ".$sql));
}

$out = array();
while ( (
$d = pg_fetch_assoc($result)) !== FALSE) {
$out[] = $d;
}

return
$out;
}
}
?>

它應該以這種方式使用

test.php
<?php
include("postgres.php");

do {
$repeat = false;
try {
pg::query("begin");

...

$result = pg::query("SELECT * FROM public.kitten");

...

pg::query("commit");
}
catch (
DependencyException $e) {
pg::query("rollback");
$repeat = true;
}
} while (
$repeat);
?>

一般的錯誤應該在前端被捕獲。

Tamas
To Top