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