2011-05-26 68 views
9

在其他情況下我可能會嘗試使用如何使用帶有SQL Server的PDO獲取最後一個INSERT行的ID?

$result = mssql_query("INSERT INTO table (fields) VALUES (data); 
         SELECT CAST(scope_identity() AS int)"); 

但我會插入用戶提交的數據,我想繼續使用PDO,它返回一個空數組。

不幸的是,我在Linux服務器上運行PHP,並使用dblib與Microsoft SQL Server進行交互,但不支持PDO::lastInsertID()

請幫忙!

更新包含的代碼示例

下面是我使用的代碼:COL1是int identity類型的字段和COL2是datetimegetdate()默認。

// Connect to db with PDO 
$pdo = new PDO('dblib:host=' . $host . ';dbname=' . $database . ';', $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
// Connect to db with MSSQL 
$sql = mssql_connect($host, $username, $password); 
mssql_select_db($database, $sql); 
// Create SQL statement 
$query = "INSERT INTO [table] (col3, col4, col5) 
      VALUES ('str1', 'str2', 'str3'); 
      SELECT SCOPE_IDENTITY() AS theID;"; 
// Run with MSSQL 
echo "Using MSSQL...\n"; 
$result = mssql_query($query); 
$the_id = mssql_result($result, 0, 'theID'); 
echo "Query OK. Returned ID is " . $the_id . "\n"; 
// Run with PDO 
echo "\nUsing PDO...\n"; 
$stmt = $pdo->query($query); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
print_r($result); 

這是被顯示的內容:

Using MSSQL... 
Query OK. Returned ID is 149 

Using PDO... 
Array 
(
) 

我很想找出我做一些愚蠢的事,而不是遇到了一個可怕的死衚衕:)

回答

10

你有幾個選擇:

SELECT @@IDENTITY - return the last ID created by actions of the current connection, regardless of table/scope 

SELECT SCOPE_IDENTITY() - last ID produced by the current connection, in scope, regardless of table 

SELECT IDENT_CURRENT('name_of_table'); - last ID produced on that table, regardless of table/scope/connection 

這三者中,SCOPE_IDENTITY()是最好的選擇。

+0

儘管'PDO'仍然返回一個空數組。難道我做錯了什麼? – Kalessin 2011-05-26 15:02:55

+0

也許嘗試別名結果:'SELECT scope_identity()AS id' – 2011-05-26 15:24:49

+0

感謝您的建議。儘管如此,我仍然得到一個空數組。我已更新我的問題以包含我正在使用的測試代碼。 – Kalessin 2011-05-26 16:35:50

0

也許你正在返回兩個行集。嘗試添加SET NOCOUNT ON;以消除INSERT的行集,或者如果驅動程序支持它,則使用$ stmt-> nextRowset。

相關問題