【问题标题】:Retrieve the ID of an inserted record: Php & MS SQL SERVER检索插入记录的 ID:Php & MS SQL SERVER
【发布时间】:2011-07-27 19:52:13
【问题描述】:

这个问题涉及到:

PHP 版本 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 检索

变体 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);

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢!这是对我有用的代码。 (我不知道如何正确格式化) $sql = "INSERT INTO users (username, password, 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】:

    首先,如果您重视数据的完整性,请不要将@@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());
    

    【讨论】:

      【解决方案3】:

      这对我有用...

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

      【讨论】:

      • 请注意 SELECT @@IDENTITY 和 SELECT SCOPE_IDENTITY() 是不同的。无论如何,它们可能在范围、会话和触发器的特定条件下返回相同的结果。参考优秀的Pinal Dave's post。
      【解决方案4】:

      我最近遇到了一个非常相似的问题,虽然我还没有在这里尝试过其他解决方案。我相信一个更好的程序员可以想出一个更好的解决方案。我对该问题的解决方案是使用选择查询生成 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。

      【讨论】:

      • 但问题是指一个自动增量 ID 字段。
      猜你喜欢
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      相关资源
      最近更新 更多