[PHP] 使用 ADODB 取得插入資料庫後的自動編號欄位值

ADODB 在 PHP 程式設計圈算是非常有名的資料庫存取套件,取 ADODB 這個名字的用意應該也是讓 M$ 的愛用者能輕鬆的用 PHP 存取資料庫。


裡面最值得參考的就是 Insert_ID 這個函式,可能因為 ADODB 開發團隊對於這個函式只用幾句話帶過去,所以幾乎很少有人在用這個函式。

這個好用在哪呢?

假設我有一筆訂單,訂單對訂單明細是一對多的關係,很多人訂單編號是用自動編號來當作 PK ,這時我寫入插入一筆訂單進資料庫時,我怎麼知道資料庫給我的訂單編號是多少呢?

可以先看一下 ADODB 裡面一個 PO_Insert_ID 的函式,可能很多人也都是這樣寫的:

function PO_Insert_ID($table="", $id="")
{
if ($this->hasInsertID){
return $this->Insert_ID();
} else {
return $this->GetOne("SELECT MAX($id) FROM $table");
}
}

看看紅字的部份,在插入訂單後,直接抓取自動編號欄位的最大值,「理論上」應該就是剛剛插入的訂單編號沒有錯。

但是實際上在大量資料庫存取的時候,在取得自動編號欄位的最大值之前,可能又有一筆訂單進來了,這時候取自動編號的最大值就不對了。

那要怎麼辦呢?

這就是 ADODB 函式庫值得參考的地方,裡面有各種不同資料庫的處理方式,以 MySQL 為例,可以參考 adodb-mysql.inc.php:

function _insertid()
{
return mysql_insert_id($this->_connectionID);
}

mysql_insert_id 是一個呼叫 MySQL 的 C API 函式:
http://tw.php.net/mysql_insert_id

由 ADODB 的 Code 看出,呼叫 mysql_insert_id 還會傳入 Connection Resource 以確定是同一個連線插入資料庫,這樣幾乎可以保證取得剛剛插入資料庫的自動編號值是正確的。

而 PHP 要呼叫 Insert_ID 的話,只要執行任一個 INSERT 的 SQL 指令後,便可呼叫 Insert_ID 了,以下為範例:

$conn->Execute("INSERT orders (user_id, order_date)
VALUES('123','2005-03-02')");
$order_id = $conn->Insert_ID();

值得注意的是,資料庫必須使用一個自動編號的欄位做為 PK ,如此才能正確的執行。

如果想知道其它資料庫的做法,可以參考 adodb-xxx.inc.php。
(xxx 為資料庫種類,如 M$ SQL Server 則為 adodb-mssql.inc.php)

ADODB 官方網站:
http://adodb.sourceforge.net/

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar