2011-07-27 17 views
6

To pytanie dotyczy:Pobierz identyfikator wstawionego rekordu: PHP i MS SQL Server

Wersja PHP 5.3.6

Microsoft Drivers for PHP for SQL Server

staram się poprawnie odzyskać Identyfikator wkładki rekordu za pomocą kombinacji PHP i SQL Server 2005 lub 2008.

To pytanie zakłada istnienie poniższej tabeli :

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)

Gdybym uruchom następującą kwerendę w Management Studio lub za pomocą ASP (Classic), rekord zostanie wstawiony i identyfikator zostanie zwrócony, ale to samo zachowanie nie wydaje się istnieć z PHP i ten sterownik.

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

muszę pomóc dowiedzieć się, jak prawidłowo ciągnąć identyfikator albo łańcuchowym SQL razem lub w każdy inny sposób.

Przepracowałem trochę kodu.

Wariant 1 jest prosty select (poprzez zapytania) - bez wstawiania lub ID retrieveal wykonywane

Wariant 2 jest przykuty instrukcja SQL, który wstawia nowy rekord poprawnie, ale nie Zwraca identyfikator

Variation 3 używa (wykonaj) zamiast (zapytanie). Rekord jest wstawiany, ale identyfikator nie jest zwracany. Ten wygenerował błąd, ponieważ polecenie sqlsrv_execute zwraca wartość true/false zamiast zestawu rekordów.

Jak mogę zmodyfikować mój kod, aby wstawić rekord i pobrać identyfikator? (Pracuję przy założeniu, że odpowiedź na to pytanie zostanie rozszerzona na Procedury przechowywane, które również zwracają dane, ale być może tak nie jest)

Dziękuję.

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

Odpowiedz

14

http://www.php.net/manual/en/function.mssql-query.php#104263

nie używam MS SQL w ogóle ale krótko przeczytać na ten temat. Wydaje się, że musisz wykonać wywołanie sqlsrv_next_result. Przykładem jest w tym komentarzu:

$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); 
+1

Dzięki! To jest kod, który zadziałał dla mnie. (Nie wiem, jak to sformatować poprawnie) $ sql = "WSTAW NA użytkowników (nazwa użytkownika, hasło, pierwsza nazwa, ostatnia nazwa) WARTOŚCI (" x "," x "," x "," x "); WYBIERZ @@ TOŻSAMOŚĆ jako id; " $ result = sqlsrv_query ($ conn, $ sql); $ next_result = sqlsrv_next_result (wynik $); $ row = sqlsrv_fetch_array ($ result); –

6

Po pierwsze, nie należy używać do tego celu @@identity jeśli cenisz integralności danych, ponieważ może wrócić złą odpowiedź. Co gorsza, może działać poprawnie przez wiele lat, zanim ktoś postawi spust na stole i zacznie cicho wysyłać niewłaściwą wartość.

Użyj klauzuli OUTPUT lub Scope_identity().

Przykład SQL czynili klauzuli wyjścia:

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

miałem bardzo podobny problem niedawno i choć nie próbowałem innych rozwiązań tutaj. Jestem pewien, że lepszy programista mógłby wymyślić lepsze rozwiązanie.Moim rozwiązaniem problemu było wygenerowanie identyfikatora UUID przy użyciu kwerendy wyboru, a następnie wstawienie identyfikatora zamiast generowania go w zapytaniu wstawiania. Jest również całkiem czysty w porównaniu do innych wymienionych tutaj rozwiązań.

Oto moje rozwiązanie:

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

Teraz masz identyfikatora pola, to wyjątkowa i masz wartość w PHP już.

Edytuj: Moje środowisko to PHP 5.3 + SQL Server 2005.

Powiązane problemy