2010-12-02 4 views
8

cette requête fonctionne bien en utilisant le pilote php_mssql:Microsoft's pilote de PHP ne renvoie aucun résultat lors de l'interrogation « SELECT SCOPE_IDENTITY() AS id »

INSERT INTO Table(columnName) VALUES ('text'); 
SELECT SCOPE_IDENTITY() AS id; 

table ne possède une colonne id, qui est un identité. Je voudrais exécuter cette requête et obtenir le dernier identifiant dans la table.

Le même code ne fonctionne pas si la requête est exécutée à l'aide du pilote php_sqlsrv de Microsoft.

Je ne pas obtenir toute erreur lors de l'exécution de la requête (sqlsrv_query fonction), mais je reçois l'erreur suivante lorsque vous appelez sqlsrv_fetch_array: « Le résultat actif de la requête ne contient pas de champs »

googlé Ive beaucoup, et n'a pas trouvé de réponse, ce fut une grande surprise pour moi que personne n'ait fait face à ce problème avant, il semble que personne n'utilise ce pilote, même s'il est "officiel" depuis la sortie de PHP 5.3 ...

Merci.

Répondre

10

Dans le CTP initial, les indices ont commencé sur le terrain à 1. Plus tard, ils ont été modifiés pour commencer à 0.

Essayez quelque chose comme ceci:

// connection to the dbserver 

$result = sqlsrv_query("INSERT INTO Table(columnName) VALUES ('text'); SELECT SCOPE_IDENTITY() AS ID"); 

echo "The last insert_id is".lastId($result); 

function lastId($queryID) { 
    sqlsrv_next_result($queryID); 
    sqlsrv_fetch($queryID); 
    return sqlsrv_get_field($queryID, 0); 
} 
+2

Ce code m'a donné l'idée de découvrir what' s passe. INSERT_QUERY renvoie 1 résultat et SELECT SCOPE_IDENTITY renvoie un autre résultat. Si vous pointez vers le 1er résultat, vous obtenez une erreur si vous essayez d'extraire un tableau (la requête d'insertion ne renvoie rien), vous devez donc rendre le résultat suivant disponible (sqlsrv_next_result) et ensuite vous pouvez appeler sqlsrv_fetch_array. WATCH OUT si vous migrez de php_mssql à php_sqlsrv, car ce comportement est différent et peut entraîner des erreurs. – molerus

+0

J'ai eu un problème similaire; J'ai utilisé sqlsrv_next_result ($ result) pour le résoudre. Au début, cela n'a pas résolu le problème. Puis plus tard, j'ai trouvé qu'il y avait une déclaration PRINT() dans mon SP qui a causé le problème. J'ai dû supprimer PRINT() et utiliser sqlsrv_next_result ($ result) aussi pour le résoudre. N'avons-nous rien qui laisserait sqlsrv_query() rejeter PRINT() ??? –

+0

J'ai eu le même problème avec les données "Messages" générées par SQL Server. L'utilisation de sqlsrv_next_result() l'a résolu. – Alan

Questions connexes