массивы — PHP в SqlServer, получение последней вставленной личности

Я пытаюсь получить последний вставленный идентификатор в моей таблице «Заказы», ​​чтобы вставить этот идентификатор в связанную таблицу «OrderItems» для каждого элемента в моем массиве корзины. Моя таблица заказов «orderID» — это моя переменная идентификатора, но когда я пытаюсь получить последнее добавленное значение, результат равен «null». Исходный запрос 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

0

Решение

У Oracle нет автоинкремента. Лучшее, что вы можете сделать, это сначала получить идентификатор, а затем выполнить вставку. Вы получаете идентификатор, как это:

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

Другие решения

$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 — вы можете получить значение из триггера или что-то.

0

По вопросам рекламы [email protected]