Я пытаюсь получить последний вставленный идентификатор в моей таблице «Заказы», чтобы вставить этот идентификатор в связанную таблицу «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
У Oracle нет автоинкремента. Лучшее, что вы можете сделать, это сначала получить идентификатор, а затем выполнить вставку. Вы получаете идентификатор, как это:
$statement = oci_parse(OCI_CONN, "Select my_seq.nextval from dual");
if (oci_execute($statement)) {
$row = oci_fetch_assoc($statement);
$id = $row['NEXTVAL'];
}
$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
— вы можете получить значение из триггера или что-то.