2011-07-27 36 views
6

這個問題涉及到:檢索插入記錄的ID:PHP和MS SQL SERVER

PHP版本5.3.6

Microsoft Drivers for PHP for SQL Server

我想正確檢索使用PHP和SQL Server 2005或2008的組合記錄插入的ID。

此問題假定存在下表:

CREATE TABLE users([id] [int] IDENTITY(1,2) NOT NULL,[username] [varchar](50) NOT NULL,[password] [varchar](40) NOT NULL,[first_name] [varchar](30) NOT NULL,[last_name] [varchar](30) NOT NULL)

如果我是運行在Management Studio或通過ASP(經典),記錄將被插入,並會返回一個ID,但相同的行爲似乎不存在以下查詢PHP和這個驅動程序。

INSERT INTO users (username, password, first_name, last_name) VALUES ('x','x','x','x') ; SELECT @@IDENTITY ;

我需要幫助搞清楚如何正確地或者通過鏈接的SQL語句一起或以任何其他方式拉一個ID。

我已經編寫了一些代碼。

變形例1是一個簡單的選擇(通過查詢) - 無插入或ID retrieveal執行

變形例2是鏈狀的SQL語句,其適當地插入新的記錄,但不返回ID

變異3使用(執行)而不是(查詢)。記錄被插入,但ID不會被返回。這一個產生了一個錯誤,因爲sqlsrv_execute返回true/false而不是記錄集。

那麼,我該如何修改我的代碼來插入記錄並找回ID? (我正在假設這個問題的答案將擴展到返回數據的存儲過程,但也許情況並非如此)

謝謝。

// Database connection 
// ------------------------------------------------------------------------------------------------------- 
$conn = sqlsrv_connect(DB_SERVER,array("UID" => DB_USER, "PWD" => DB_PASSWORD, "Database"=> DB_NAME)); 

// Variation 1, straight select 
// ------------------------------------------------------------------------------------------------------- 
$sql = "SELECT * FROM users;"; 
$result = sqlsrv_query($conn,$sql); 
$row = sqlsrv_fetch_array($result); 

// Variation 2, Insert new record and select @@IDENTITY 
// ------------------------------------------------------------------------------------------------------- 
$sql = "INSERT INTO users (username, password, first_name, last_name) VALUES ('x','x','x','x') ; SELECT @@IDENTITY ;"; 
$result = sqlsrv_query($conn,$sql); 
$row = sqlsrv_fetch_array($result); 

// Variation 3, using EXECUTE instead of QUERY 
// ------------------------------------------------------------------------------------------------------- 
//$sql = "INSERT INTO users (username, password, first_name, last_name) VALUES ('x','x','x','x') ; SELECT @@IDENTITY as id ;"; 
$sql = "INSERT INTO users (username, password, first_name, last_name) VALUES ('x','x','x','x') ; SELECT SCOPE_IDENTITY() as id ;"; 

$stmt = sqlsrv_prepare($conn, $sql); 
$result = sqlsrv_execute($stmt); 
$row = sqlsrv_fetch_array($result); 

回答

14

http://www.php.net/manual/en/function.mssql-query.php#104263

我不使用MS SQL可言,但對這個簡單讀了。您似乎需要撥打sqlsrv_next_result電話。一個例子是在評論規定:

$query = "INSERT INTO test (col1, col2) VALUES (?,?); SELECT SCOPE_IDENTITY()"; 
$resource=sqlsrv_query($conn, $query, $arrParams); 
sqlsrv_next_result($resource); 
sqlsrv_fetch($resource); 
echo sqlsrv_get_field($resource, 0); 
+1

謝謝!這是爲我工作的代碼。 (我不知道如何正確格式化) $ sql =「INSERT INTO users(username,password,first_name,last_name)VALUES('x','x','x','x'); SELECT @@ IDENTITY作爲ID;「 $ result = sqlsrv_query($ conn,$ sql); $ next_result = sqlsrv_next_result($ result); $ row = sqlsrv_fetch_array($ result); –

6

首先,不要使用@@identity用於此目的,如果你珍惜你的數據的完整性,因爲它可以返回錯誤的答案。更糟糕的是,在有人在桌子上放置觸發器之前,它可以正常工作多年,並開始悄悄地發送錯誤的值。使用OUTPUT子句或Scope_identity()。用來做輸出條款的SQL

例子:

DECLARE @MyTableVar table(myID int, 
          myName varchar(50), 
          ModifiedDate datetime); 
INSERT dbo.mytable 
    OUTPUT INSERTED.myID, INSERTED.myName, INSERTED.ModifiedDate 
     INTO @MyTableVar 
VALUES ('test', GETDATE()); 
0

我最近有一個非常類似的問題,而我在這裏沒有嘗試過其他的解決方案。我相信一個更好的程序員可以想出更好的解決方案。我對該問題的解決方案是使用select查詢生成UUID,然後插入ID而不是在我的插入查詢中生成它。與此處列出的其他解決方案相比,它也相當乾淨。

這裏是我的解決方案:

//Create the UUID 
$uid = mssql_fetch_assoc(mssql_query("SELECT CONVERT(VARCHAR(200),NEWID()) as id")); 

//Insert the item 
$sql = "INSERT INTO TableName (Uid,colA,colB) VALUES ('".$uid['id']."','a','b')"; 

現在你有外地的ID,它是獨一無二的,你必須在PHP中的值了。

編輯:我的環境是PHP 5.3 + SQL Server 2005.