检索插入记录的ID:Php& MS SQL SERVER

时间:2011-07-27 19:52:14

标签: php sql-server sql-server-2008 sql-server-2005

  

这个问题涉及:

     

PHP Version 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(Classic)运行,将插入一条记录并返回一个ID,但PHP和此驱动程序似乎不存在相同的行为。

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

我需要帮助找出如何通过将SQL语句链接在一起或通过任何其他方法来正确地提取ID。

我编写了一些代码。

变体1是一个简单的选择(通过查询) - 没有执行插入或ID检索

Variation 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);

4 个答案:

答案 0 :(得分:16)

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 :(得分: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());

答案 2 :(得分: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。

答案 3 :(得分:0)

这对我有用...

 $sql = "Insert into MyTable(column1,column2,column3) VALUES (? , ? , ?); SELECT @@IDENTITY as id;";
 $params = array($value1,$value2,$value3);
 $stmt = sqlsrv_query( $conn, $sql, $params);
 $next_result = sqlsrv_next_result($stmt); 
 $row = sqlsrv_fetch_array($stmt); 
 echo "ROW INSERTED WITH ID : " . $row["id"];
 if( $stmt === false ) {
 Echo "Error writing new application to table";
 }