如何使用sqlsrv和“?”样式参数在php中执行存储过程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用sqlsrv和“?”样式参数在php中执行存储过程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1973字,纯文字阅读大概需要3分钟。
内容图文
![如何使用sqlsrv和“?”样式参数在php中执行存储过程](/upload/InfoBanner/zyjiaocheng/890/684611fda0224e8593a762c1f6a16e89.jpg)
我已经查看了其他几个看起来与问题相同的问题(来自标题).但是,我的情况有点不同.
以下工作(即我获得“成功”,我的数据库执行我在使用给定变量运行过程时所期望的):
$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中工作,如果按照我上面提到的方式调用的话.同样,我已经确认我可以对任何原始查询使用参数化查询(如插入,选择,更新与存储过程).
所以,我的问题是如何使用参数化查询调用存储过程vs在查询字符串中嵌入变量?
更重要的是,我实际上想要使用准备/执行,所以希望答案将允许这也可以工作.
解决方法:
php.net上的用户贡献有关于如何使用sqlsrv-prepare执行存储过程的文章.
如果从php.net中删除用户以后的贡献,这里是它已经列出的内容:
$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);
这是手册的页面,http://php.net/manual/en/function.sqlsrv-prepare.php
内容总结
以上是互联网集市为您收集整理的如何使用sqlsrv和“?”样式参数在php中执行存储过程全部内容,希望文章能够帮你解决如何使用sqlsrv和“?”样式参数在php中执行存储过程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。