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

Ral*_*era 9 php sql-server sql-server-2005 sql-server-2008

这个问题涉及到:

PHP版本5.3.6

适用于SQL Server的PHP的Microsoft驱动程序

我试图使用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检索

变体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);
Run Code Online (Sandbox Code Playgroud)

Jon*_*hon 18

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); 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这是适合我的代码.(我不知道如何正确格式化)$ sql ="INSERT INTO用户(用户名,密码,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); (2认同)

HLG*_*GEM 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());
Run Code Online (Sandbox Code Playgroud)