2015-07-22 7 views
6

Ich habe über mehrere andere Fragen, die scheinen (aus den Titeln) das gleiche wie folgt. Mein Fall ist jedoch ein bisschen anders.Wie eine gespeicherte Prozedur in PHP mit sqlsrv und "?" Stil Parameter

Die folgenden Werke (dh ich „Erfolg“ und meine Datenbank durchführt, was ich erwarte, wenn das Verfahren mit den gegebenen Variablen ausgeführt wird):

$sql = "MyDB.dbo.myProcedure {$var1}, {$var2}, {$var3}"; 
$result = sqlsrv_query($myConn, $sql); 
if (!$result) { 
    echo 'Your code is fail.'; 
} 
else { 
    echo 'Success!'; 
} 

ich SQL vermeiden wollen (oder verringern die Möglichkeit) Injektion durch Erstellen der SQL-Zeichenfolge mithilfe von Parametern. Zum Beispiel:

$sql = "select * from aTable where col1 = ? AND col2 = ?"; 
$result = sqlsrv_query($myConn, $sql, array($var1, $var2)); 
//please note. This code WILL work! 

Aber wenn ich das mit einer gespeicherten Prozedur tun, schlägt es fehl. Es schlägt fehl, ohne dass über sqlsrv_errors() Fehler gemeldet wurden, keine Aktion in der Datenbank und $result === false.

Um klar zu sein, schlägt der folgende:

$sql = "MyDB.dbo.myProcedure ?, ?, ?"; 
$result = sqlsrv_query($myConn, $sql, array($var1, $var2, $var3)); 

Ebenso ist eine Prepare/execute-Anweisung die gleiche Art und Weise erstellt auch scheitern:

$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. 

Der Vollständigkeit halber ich, dass die gespeicherte Prozedur bestätigt haben in Frage arbeitet direkt innerhalb von SQL Management Studio und wenn so genannt, wie ich oben erwähnt. Ebenso habe ich bestätigt, dass ich kann parametrisierte Abfragen für jede unbearbeitete Abfrage verwenden (wie ein Einfügen, Auswählen, Update vs eine gespeicherte Prozedur).

Meine Frage ist also, wie kann ich eine gespeicherte Prozedur mit der parametrisierten Abfrage vs Einbetten der Variablen in die Abfragezeichenfolge aufrufen?

Noch wichtiger ist, ich möchte tatsächlich eine Vorbereitung/Ausführung verwenden, also hoffentlich die Antwort wird dies auch funktionieren.

+1

Haben Sie versucht wie das Beispiel auf der Handbuchseite? '$ sql =" EXEC stp_Create_Item @Item_ID =?, @Item_Name =? ";' http://php.net/manual/de/function.sqlsrv-prepare.php ...oder nicht die Beispiele, sondern aus den 'User Contributed Notes' – chris85

+0

Ich lese die Benutzer beigetragen Notizen auf der sqlsrv_query Seite, aber offensichtlich habe ich nicht gelesen oder bemerkt dieses Beispiel auf der Seite, die Sie verknüpft. Dies ist anscheinend der Weg, dies zu tun. Möchten Sie dies als Antwort hinzufügen, damit ich es für zukünftige Suchanfragen markieren kann? Ansonsten werde ich es tun. – LittleTreeX

Antwort

6

Die Benutzerbeiträge auf dem php.net haben eine Beschreibung darüber, wie man eine gespeicherte Prozedur mit sqlsrv-prepare ausführt.

Im Fall, dass von den php.net Nutzerbeiträge in der Zukunft hier entfernt ist, was es hatte (hat) aufgeführt:

$procedure_params = array(
array(&$myparams['Item_ID'], SQLSRV_PARAM_OUT), 
array(&$myparams['Item_Name'], SQLSRV_PARAM_OUT) 
); 
// EXEC the procedure, {call stp_Create_Item (@Item_ID = ?, @Item_Name = ?)} seems to fail with various errors in my experiments 
$sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?"; 
$stmt = sqlsrv_prepare($conn, $sql, $procedure_params); 

Hier ist die Seite Anleitung, http://php.net/manual/en/function.sqlsrv-prepare.php

3

Dies ist ein Follow bis zur Antwort von @ chris85.

Es ist erwähnenswert, hier, dass, sobald die Anweisung vorbereitet wird, müssen Sie es ausführen:

$sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?"; 
$stmt = sqlsrv_prepare($conn, $sql, $procedure_params); 
if (!sqlsrv_execute($stmt)) { 
    echo "Your code is fail!"; 
    die; 
} 
while($row = sqlsrv_fetch_rows($stmt)){ 
    //Stuff 
} 

sqlsrv_execute() liefert nur wahr/falsch. Wenn Sie die von der gespeicherten Prozedur zurückgegebenen Daten analysieren möchten, können Sie sie wie das Ergebnis von sqlsrv_query() verarbeiten.

Wenn Sie die sqlsrv_execute() vergessen, erhalten Sie eine Fehlermeldung, dass das Ergebnis ausgeführt werden muss, bevor es verwendet werden kann.

+0

Nicht sicher, warum die down vote? – AndyD273

Verwandte Themen