一尘不染

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

php

这个问题涉及:

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(经典)运行以下查询,将插入一条记录并返回一个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);

阅读 157

收藏
2020-05-29

共1个答案

一尘不染

http://www.php.net/manual/zh/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);
2020-05-29