2011-07-27 34 views
6

Esta pregunta se refiere a:Recuperar el ID de un registro insertado: SERVIDOR PHP y MS SQL

PHP versión 5.3.6

Microsoft Drivers for PHP for SQL Server

estoy tratando de recuperar adecuadamente el ID de una inserción de registro usando una combinación de PHP y SQL Server 2005 o 2008.

Esta pregunta asume la existencia de la siguiente tabla :

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)

Si tuviera que ejecutar la siguiente consulta en Management Studio o mediante ASP (Classic), se inserta un registro y se devolvería una identificación, pero no parece existir con el mismo comportamiento PHP y este controlador.

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

Necesito ayuda para encontrar la manera de tirar adecuadamente una identificación ya sea por el encadenamiento de las sentencias SQL juntos o por cualquier otro método.

He trabajado algún código.

Variación 1 es un selecto sencilla (a través de la consulta) - sin inserción o ID retrieveal realiza

Variación 2 es una instrucción SQL en cadena que se inserta el nuevo disco correctamente, pero no devuelve el ID

Variación 3 usos (ejecución) en lugar de (consulta). El registro se inserta, pero la ID no se devuelve. Este generó un error porque sqlsrv_execute devuelve verdadero/falso en lugar de un conjunto de registros.

Entonces, ¿cómo puedo modificar mi código para insertar un registro y recuperar un ID? (Estoy trabajando en la suposición de que la respuesta a esta pregunta se extenderá a los Procedimientos almacenados que también devuelven datos, pero tal vez ese no sea el caso)

Gracias.

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

Respuesta

14

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

No consumo de MS SQL en absoluto, sino han leído brevemente en esto. Parece que necesitas hacer una llamada a sqlsrv_next_result. Se proporciona un ejemplo en el que el comentario:

$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

¡Gracias! Este es el código que funcionó para mí. (No sé cómo formatear esto correctamente) $ sql = "INSERT INTO users (username, password, first_name, last_name) VALUES ('x', 'x', 'x', 'x'); SELECT @@ IDENTITY como id; " $ result = sqlsrv_query ($ conn, $ sql); $ next_result = sqlsrv_next_result ($ result); $ row = sqlsrv_fetch_array ($ result); –

6

En primer lugar, no utilizan @@identity para este propósito si el valor de la integridad de los datos, ya que puede retornar una respuesta errónea. Lo que es peor, puede funcionar correctamente durante años antes de que alguien ponga un gatillo en la mesa y comience a enviar el valor incorrecto.

Utilice la cláusula OUTPUT o Scope_identity().

Ejemplo de SQL utilizada para hacer la cláusula de salida:

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

que tenía un problema muy similar recientemente y, aunque no he probado las otras soluciones aquí. Estoy seguro de que un mejor programador podría encontrar una mejor solución.Mi solución al problema fue generar el UUID utilizando una consulta de selección y luego insertar el ID en lugar de generarlo en mi consulta de inserción. También es bastante limpio en comparación con las otras soluciones enumeradas aquí.

aquí está mi solución:

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

Ahora usted tiene el ID del campo, que es único, y tiene el valor en PHP ya.

Editar: Mi entorno es PHP 5.3 + SQL Server 2005.

Cuestiones relacionadas