Правильный путь / местоположение для использования Scope_Identity () - PullRequest
1 голос
/ 12 апреля 2020

У меня есть автоинкрементный идентификатор, называемый deviceID, в одном из моих полей. Я хотел передать это сеансу в php для последующего использования и планировал использовать scope_identity(), так как я понимаю, что это лучший способ получить текущий идентификатор первичного ключа. Однако всякий раз, когда я пытался использовать его, у меня появлялось сообщение об ошибке, в котором говорилось, что это неопределенная функция. Вот мой код так без scope_identity():

<?php
session_start();
include 'db.php';

$screenWidth = $_POST['screenWidth'];
$screenHeight = $_POST['screenHeight'];
$HandUsed = $_POST['HandUsed'];

$_SESSION["screenWidth"] = $screenWidth;
$_SESSION["screenHeight"] = $screenHeight;

if (isset($_POST['submit'])) { 
    $screenWidth = $_POST['screenWidth'];
    $screenHeight = $_POST['screenHeight'];
    $phoneType = $_POST['phoneName'];
    $HandUsed = $_POST['HandUsed'];
    $_SESSION["HandUsed"] = $HandUsed;
    $_SESSION["phoneName"] = $phoneType;

    echo 'hello';

    $sql = "
       INSERT INTO DeviceInfo (DeviceID, screenWidth, phoneType, screenHeight, HandUsed)
       VALUES ('$screenWidth','$phoneType', '$screenHeight', '$HandUsed')
       SELECT SCOPE_IDENTITY() as DeviceID
    ";
    if (sqlsrv_query($conn, $sql)) {
        echo ($sql);
        echo "New record has been added successfully !";
    } else {
        echo "Error: " . $sql . ":-" . sqlsrv_errors($conn);
    }

    sqlsrv_close($conn);
}
?>

1 Ответ

0 голосов
/ 14 апреля 2020

Вам необходимо исправить некоторые проблемы в вашем коде:

  • Неверное утверждение INSERT - у вас пять столбцов, но только четыре значения в этом утверждении. Я предполагаю, что DeviceID является столбцом идентификаторов, поэтому удалите этот столбец из списка столбцов.
  • Используйте параметры в своем утверждении. Функция sqlsrv_query() выполняет как подготовку операторов, так и их выполнение, и может использоваться для выполнения параметризованных запросов.
  • Используйте SET NOCOUNT ON в качестве первой строки в вашем операторе, чтобы SQL Сервер не мог передать количество затронутых строк. как часть набора результатов.
  • SCOPE_IDENTITY() используется правильно и должен возвращать ожидаемый ID. Конечно, в зависимости от требований вы можете использовать IDENT_CURRENT().

Следующий пример (на основе кода в вопросе) является рабочим решением:

<?php
session_start();
include 'db.php';

if (isset($_POST['submit'])) { 
    $screenWidth = $_POST['screenWidth'];
    $phoneType = $_POST['phoneName'];
    $screenHeight = $_POST['screenHeight'];
    $HandUsed = $_POST['HandUsed'];

    $params = array($screenWidth, $phoneType, $screenHeight, $HandUsed);
    $sql = "
        SET NOCOUNT ON
        INSERT INTO DeviceInfo (screenWidth, phoneType, screenHeight, HandUsed)
        VALUES (?, ?, ?, ?)
        SELECT SCOPE_IDENTITY() AS DeviceID
    ";
    $stmt = sqlsrv_query($conn, $sql, $params);
    if ($stmt === false) {
        echo "Error: " . $sql . ": " . print_r(sqlsrv_errors());
        exit;
    }

    echo "New record has been added successfully !";
    while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        echo $row["DeviceID"];
    }
    sqlsrv_free_stmt($stmt);

    sqlsrv_close($conn);
}
?>
...