Я просмотрел несколько других вопросов, которые кажутся (из названий) такими же, как это. Однако мой случай немного отличается.
Следующие работы (т.е. я получаю "успех", и моя база данных выполняет то, что я ожидаю при запуске процедуры с заданными переменными):
$sql = "MyDB.dbo.myProcedure {$var1}, {$var2}, {$var3}";
$result = sqlsrv_query($myConn, $sql);
if (!$result) {
echo 'Your code is fail.';
}
else {
echo 'Success!';
}
Я хочу избежать (или уменьшить вероятность) SQL-инъекции, создав строку SQL, используя параметры. Например:
$sql = "select * from aTable where col1 = ? AND col2 = ?";
$result = sqlsrv_query($myConn, $sql, array($var1, $var2));
//please note. This code WILL work!
Но когда я делаю это с помощью хранимой процедуры, он терпит неудачу. Он терпит неудачу, не сообщая об ошибках через sqlsrv_errors(), никаких действий в базе данных и $result === false
.
Чтобы быть ясным, выполняется следующее:
$sql = "MyDB.dbo.myProcedure ?, ?, ?";
$result = sqlsrv_query($myConn, $sql, array($var1, $var2, $var3));
Аналогично созданный таким же образом оператор prepare/execute также завершится неудачей:
$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.
Для полноты, я подтвердил, что хранимая процедура, о которой идет речь, работает непосредственно в SQL Management Studio И если называется так, как я упоминал выше. Аналогично, я подтвердил, что я может использовать параметризованные запросы для любого необработанного запроса (например, вставка, выбор, обновление и хранимая процедура).
Итак, мой вопрос заключается в том, как я могу вызвать хранимую процедуру с использованием параметризованного запроса и встраивания переменных в строку запроса?
Что еще более важно, я действительно хочу использовать команду prepare/execute, поэтому, надеюсь, ответ позволит этому и работать.