Comment faire pour exécuter une procédure stockée en php à l'aide de sqlsrv et “?” paramètres de style
J'ai regardé sur plusieurs autres questions qui semblent (de titres) la même chose que ce. Cependant, mon cas est un peu différent.
Les ouvrages suivants (c'est à dire j'obtiens un "succès" et ma base de données effectue ce que j'attends lors de l'exécution de la procédure avec les variables):
$sql = "MyDB.dbo.myProcedure {$var1}, {$var2}, {$var3}";
$result = sqlsrv_query($myConn, $sql);
if (!$result) {
echo 'Your code is fail.';
}
else {
echo 'Success!';
}
Je veux éviter (ou de diminuer la possibilité d') d'injection SQL par la création de la chaîne SQL à l'aide de paramètres. Par exemple:
$sql = "select * from aTable where col1 = ? AND col2 = ?";
$result = sqlsrv_query($myConn, $sql, array($var1, $var2));
//please note. This code WILL work!
Mais quand je le fais avec une procédure stockée, il échoue. Il ne parvient pas à pas les erreurs signalées par sqlsrv_errors(), aucune des mesures prises dans la base de données, et $result === false
.
Pour être clair, la suivante échoue:
$sql = "MyDB.dbo.myProcedure ?, ?, ?";
$result = sqlsrv_query($myConn, $sql, array($var1, $var2, $var3));
De même un prepare/execute créés de la même façon, échouera aussi:
$sql = "MyDB.dbo.myProcedure ?, ?, ?";
$stmt = sqlsrv_prepare($myConn, $sql, array(&$var1, &$var2, &$var3));
foreach($someArray as $key => $var3) {
if(sqlsrv_execute($stmt) === false) {
echo 'mucho fail.';
}
}
//this code also fails.
Pour être complet, j'ai confirmé que la procédure stockée en question fonctionne directement dans SQL Management Studio ET si elle est appelée la façon dont je l'ai mentionné ci-dessus. De même, j'ai confirmé que je peut utiliser des requêtes paramétrées pour la crue de la requête (par exemple, un insert, select, update vs une procédure stockée).
Donc, ma question est comment puis-je appeler une procédure stockée à l'aide de la requête paramétrée vs, l'incorporation de ces variables dans la chaîne de requête?
Plus important, je suis réellement désireux d'utiliser une préparation et d'exécution, donc j'espère que la réponse sera de permettre que cela fonctionne ainsi.
$sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?";
php.net/manual/en/function.sqlsrv-prepare.php ... ou pas, les exemples, mais à partir de la User Contributed Notes
J'ai lu par l'utilisateur contribué notes sur le sqlsrv_query page, mais évidemment, je n'ai pas le lire ou de l'avis de cet exemple sur la page liée. Ce qui, apparemment, est la façon de le faire. Voulez-vous ajouter ce que une réponse, donc je peux le marquer pour toute les futures recherches? Sinon, je vais le faire.
OriginalL'auteur LittleTreeX | 2015-07-22
Vous devez vous connecter pour publier un commentaire.
Les contributions des utilisateurs sur le php.net avoir une écriture sur la façon d'exécuter une procédure stockée à l'aide de la sqlsrv-préparer.
Dans le cas qui est retirée de l'php.net les contributions des utilisateurs dans l'avenir, voici ce qu'il avait(a) répertorié:
Voici le manuel de la page, http://php.net/manual/en/function.sqlsrv-prepare.php
OriginalL'auteur chris85
C'est un suivi de la réponse par @chris85.
Il est intéressant de noter ici que, une fois que l'instruction est préparée, vous devez l'exécuter:
sqlsrv_execute()
ne retourne true/false. Si vous souhaitez analyser les données renvoyées par la procédure stockée, vous pouvez le traiter comme le résultat desqlsrv_query()
.Si vous oubliez le
sqlsrv_execute()
vous obtiendrez un message d'erreur indiquant que le résultat doit être exécutée avant de pouvoir être utilisé.Je pense que
sqlsrv_fetch_array
ou tout simplementsqlsrv_fetch
est ce que c'est.sqlsrv_fetch_rows
n'existe pas. recherche sur google. Il ne fonctionne pas sur php 7.2Merci, corrigé.
OriginalL'auteur AndyD273