2015-07-22 19 views
6

Ho esaminato molte altre domande che sembrano (dai titoli) le stesse di questo. Tuttavia, il mio caso è un po 'diverso.Come eseguire una procedura memorizzata in php usando sqlsrv e "?" parametri di stile

I seguenti lavori (cioè ottengo "successo" e il mio database esegue quello che mi aspetto quando si esegue la procedura con le variabili date):

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

voglio evitare (o ridurre la possibilità di) SQL iniezione creando la stringa SQL utilizzando i parametri. Ad esempio:

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

Ma quando lo faccio con una stored procedure fallisce. Fallisce senza errori segnalati tramite sqlsrv_errors(), nessuna azione eseguita nel database e $result === false.

Per chiarezza, il seguente fallisce:

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

Analogamente un'istruzione preparazione/esecuzione creata allo stesso modo anche sicuro:

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

Per completezza, ho confermato che la procedura memorizzata in questione funziona direttamente in SQL Management Studio E se chiamato come ho menzionato sopra. Allo stesso modo, ho confermato che I può utilizzare query parametrizzate per qualsiasi query non elaborata (come un inserimento, selezionare, aggiornamento vs una stored procedure).

Quindi, la mia domanda è: come posso chiamare una stored procedure utilizzando la query parametrizzata e incorporando le variabili nella stringa di query?

Ancora più importante, in realtà sto volendo utilizzare una preparazione/esecuzione, quindi speriamo che la risposta consenta anche a questo di funzionare.

+1

Hai provato come nell'esempio sulla pagina di manuale? '$ sql =" EXEC stp_Create_Item @Item_ID =?, @Item_Name =? ";' http://php.net/manual/en/function.sqlsrv-prepare.php ...o non gli esempi, ma dalle "Note di contribuzione dell'utente" – chris85

+0

Ho letto le note degli utenti nella pagina sqlsrv_query, ma ovviamente non ho letto o notato questo esempio sulla pagina che hai collegato. Questo a quanto pare è il modo per farlo. Vuoi aggiungere questo come risposta, quindi posso contrassegnarlo per eventuali ricerche future? Altrimenti lo farò. – LittleTreeX

risposta

6

I contributi dell'utente su php.net hanno una descrizione su come eseguire una stored procedure utilizzando sqlsrv-prepare.

Nel caso in cui viene rimosso dai contributi degli utenti php.net in futuro qui è quello che aveva (ha) di cui:

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

Ecco la pagina del manuale, http://php.net/manual/en/function.sqlsrv-prepare.php

3

Si tratta di un follow fino alla risposta di @ chris85.

Vale la pena notare qui che una volta che la dichiarazione è preparato, è necessario eseguirlo:

$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() restituisce solo vero/falso. Se si desidera analizzare i dati restituiti dalla stored procedure, è possibile elaborarli come il risultato di sqlsrv_query().

Se si dimentica lo sqlsrv_execute(), verrà visualizzato un errore che indica che il risultato deve essere eseguito prima che possa essere utilizzato.

+0

Non sai perché il voto negativo? – AndyD273

Problemi correlati