Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检索插入记录的ID:Php&;MS SQL SERVER_Php_Sql Server_Sql Server 2008_Sql Server 2005 - Fatal编程技术网

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

检索插入记录的ID:Php&;MS SQL SERVER,php,sql-server,sql-server-2008,sql-server-2005,Php,Sql Server,Sql Server 2008,Sql Server 2005,这个问题涉及: PHP版本5.3.6 我正在尝试使用PHP和SQLServer2005或2008的组合正确检索记录插入的ID 本问题假设存在下表: 创建表用户([id][int]IDENTITY(1,2)不为NULL,[username][varchar](50)不为NULL,[password][varchar](40)不为NULL,[first_name][varchar](30)不为NULL) 如果在ManagementStudio中或通过ASP(Classic)运行以下查询,将插入一条

这个问题涉及:

PHP版本5.3.6

我正在尝试使用PHP和SQLServer2005或2008的组合正确检索记录插入的ID

本问题假设存在下表:

创建表用户([id][int]IDENTITY(1,2)不为NULL,[username][varchar](50)不为NULL,[password][varchar](40)不为NULL,[first_name][varchar](30)不为NULL)

如果在ManagementStudio中或通过ASP(Classic)运行以下查询,将插入一条记录并返回一个ID,但PHP和此驱动程序似乎不存在相同的行为

在用户(用户名、密码、名字、姓氏)中插入值('x'、'x'、'x'、'x');选择@标识

我需要帮助,找出如何通过将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);

我根本不使用MS SQL,但已经简要地阅读了这方面的内容。似乎您需要在下一个结果中调用sqlsrv_。该评论中提供了一个示例:

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

首先,如果您重视数据的完整性,因为它可能返回错误的答案,请不要为此使用
@@identity
。更糟糕的是,它可以正常工作数年,直到有人把触发器放在桌子上,它开始悄悄地发送错误的值

使用
OUTPUT
子句或
Scope\u identity()

用于执行output子句的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());

我最近遇到了一个非常类似的问题,虽然我还没有尝试过其他的解决方案。我相信一个更好的程序员可以想出一个更好的解决方案。我的解决方案是使用select查询生成UUID,然后插入ID,而不是在insert查询中生成。与这里列出的其他解决方案相比,它也非常干净

以下是我的解决方案:

//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中的值

编辑:我的环境是PHP5.3+SQLServer2005。

这对我很有用

 $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";
 }  

谢谢这是对我有用的代码。(我不知道如何正确设置格式)$sql=“插入用户(用户名、密码、名字、姓氏)值('x'、'x'、'x'、'x'、'x');选择@标识作为id;“$result=sqlsrv\u查询($conn,$sql)$next_result=sqlsrv_next_result($result)$row=sqlsrv\u fetch\u数组($result);但问题涉及自动增量Id字段。请注意,SELECT@@IDENTITY和SELECT SCOPE\u IDENTITY()是不同的。无论如何,在作用域、会话和触发器的特定条件下,它们可能返回相同的结果。参考优秀的。