Ral*_*era 9 php sql-server sql-server-2005 sql-server-2008
这个问题涉及到:
PHP版本5.3.6
我试图使用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)
首先,@@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)