Получить идентификатор вставленной записи: Php & MS SQL SERVER - PullRequest
7 голосов
/ 27 июля 2011

Этот вопрос относится к:

PHP версии 5.3.6

Драйверы Microsoft для PHP для SQL Server

Я пытаюсь правильно получить идентификатор вставки записи, используя комбинацию PHP и SQL Server 2005 или 2008.

В этом вопросе предполагается наличие следующей таблицы:

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), была бы вставлена ​​запись и был бы возвращен идентификатор, но, похоже, такого же поведения нет в PHP и этом драйвере.

INSERT INTO users (username, password, first_name, last_name) VALUES ('x','x','x','x') ; SELECT @@IDENTITY ;

Мне нужна помощь, чтобы выяснить, как правильно извлекать идентификатор, объединяя операторы SQL вместе или любым другим методом.

Я обработал некоторый код.

Вариант 1 - это простой выбор (с помощью запроса) - вставка или извлечение идентификатора не выполняются

Вариант 2 - оператор SQL в виде цепочки, который правильно вставляет новую запись, но не возвращает идентификатор

VariatИон 3 использует (выполнить) вместо (запрос).Запись вставлена, но идентификатор не возвращается.Эта ошибка вызвала ошибку, потому что sqlsrv_execute возвращает true / false вместо набора записей.

Итак, как я могу изменить свой код для вставки записи и получения идентификатора?(Я работаю в предположении, что ответ на этот вопрос будет распространяться на хранимые процедуры, которые также возвращают данные, но, возможно, это не так)

Спасибо.

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

Ответы [ 3 ]

16 голосов
/ 27 июля 2011

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); 
6 голосов
/ 28 июля 2011

Во-первых, не используйте @@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());
0 голосов
/ 19 апреля 2012

Недавно у меня была очень похожая проблема, и, хотя я не пробовал другие решения здесь.Я уверен, что лучший программист может придумать лучшее решение.Мое решение проблемы состояло в том, чтобы сгенерировать UUID с помощью запроса выбора, а затем вставить идентификатор вместо генерации его в моем запросе вставки.Это также довольно чисто по сравнению с другими решениями, перечисленными здесь.

Вот мое решение:

//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')";

Теперь у вас есть идентификатор поля, он уникален и у вас есть значение в PHPуже.

Редактировать: моя среда PHP 5.3 + SQL Server 2005.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...