【问题标题】:PHP to SqlServer, Getting the last inserted identityPHP 到 SqlServer,获取最后插入的标识
【发布时间】:2015-05-10 18:58:53
【问题描述】:

我试图在我的 Orders 表中获取最后插入的标识,以便为我的购物车数组中的每个项目将相同的 ID 插入到链接的 OrderItems 表中。我的 Orders 表“orderID”是我的标识变量,但是当我尝试提取最近插入的值时,结果为“null”。对 Orders 表的原始 INSERT 查询是成功的,但由于某种原因“SELECT @@IDENTITY”查询不成功。

PHP 代码

$ordersquery= "INSERT INTO Orders (customerID, orderDate, OrderOrigin) VALUES ('{$phonenumber}', '{$time}', 'online')";
echo $ordersquery."\n";

$result= mssql_query($ordersquery, $db);
var_dump($result);
echo mssql_get_last_message();


$idquery= "SELECT @@IDENTITY as id";
$result= mssql_query($idquery, $db);
$id= mssql_fetch_array($result)[$id];
var_dump($id);

foreach ($cart as $item) {
    $itemID= $item['id'];
    $quantity= $item['quantity'];
    $orderitemsquery= "INSERT INTO OrderItems VALUES ('{$id}' '{$itemID}', '{$quantity}')";
    if ($resultitems= mssql_query($orderitemsquery, $db)){
        echo $orderitemsquery;
    }
}

结果

INSERT INTO Orders (customerID, orderDate, OrderOrigin) VALUES ('(433) 943-4334', '2015-05-10 14:46:40', 'online')
boolean true
The statement has been terminated.
null
boolean false

【问题讨论】:

    标签: php arrays sql-server identity


    【解决方案1】:

    Oracle 没有自动增量。您能做的最好的事情是先获取 id,然后再进行插入。你得到这样的 id:

    $statement = oci_parse(OCI_CONN, "Select my_seq.nextval from dual");
    if (oci_execute($statement)) {
        $row = oci_fetch_assoc($statement);
        $id = $row['NEXTVAL'];
    } 
    

    【讨论】:

      【解决方案2】:
      $query = "INSERT INTO Orders (customerID, orderDate, OrderOrigin) VALUES (?,?,?); SELECT SCOPE_IDENTITY()";
      $resource=sqlsrv_query($conn, $query, $arrParams); 
      sqlsrv_next_result($resource);  //note this line!!
      sqlsrv_fetch($resource); 
      echo sqlsrv_get_field($resource, 0);
      

      或者 - 如果您更喜欢“mssql_”扩展函数:

      $sql = "INSERT INTO Orders (customerID, orderDate, OrderOrigin) VALUES (?,?,?); SELECT SCOPE_IDENTITY()";
      $results = mssql_fetch_assoc(mssql_query($sql));
      $lastid=$results[0];
      

      SCOPE_IDENTITY 通常更好,因为@@IDENTITY 是跨范围的——它是当前会话中插入任何表的最后一个标识,所以你最好小心@@IDENTITY——你可以从触发器或其他东西中获取值.

      【讨论】:

      • INSERT INTO INSERT INTO 很有趣。您可能想解释为什么SCOPE_IDENTITY@@IDENTITY 更受欢迎。也许建议了解OUTPUT 子句。
      • @HABO 抱歉,刚刚弄乱了我的复制粘贴,双插入只是一个错字。 @@IDENTITY 是跨范围的——它是在当前会话中插入到 ANY 表中的最后一个标识。 SCOPE_INEDTITY 通常更好。将编辑答案以反映这一点。
      • @SergeShultz 你能解释一下吗?
      • @IrisSpik 解释什么?基本思想是将SELECT SCOPE_IDENTITY() 放入主查询中。我只是使用 sqlsrv_ 函数而不是你的 mssql_ 函数,这是习惯问题。我将添加一个与答案等效的mssql
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2013-05-27
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多