PHP得到mssql的存储过程的输出参数功能实现


Posted in PHP onNovember 23, 2012

在开发过程中可能会遇到无法取得MSSQL存储过程的输出参数,很多朋友都不知道该怎么办,本文将详细介绍PHP得到mssql的存储过程的输出参数功能实现,需要了解的朋友可以参考下

<? 
$conn=mssql_connect("127.0.0.1","user","passwd"); 
mssql_select_db("mydb"); 
$stmt=mssql_init("pr_name",$conn);// 
$a=50001; 
mssql_bind($stmt,"RETVAL",$val,SQLVARCHAR); //用于直接返回return -103此类的值。 
mssql_bind($stmt,"@outvar",$b,SQLVARCHAR,true);//用于返回在存储过程中定义的输出参数 
mssql_bind($stmt,"@invar",$a,SQLINT4); 
$result = mssql_execute($stmt,true);//不能返回结果集,只能得到输出参数 
//$result = mssql_execute($stmt,false); //返回结果集 
//$records=mssql_fetch_array($result); 
//print_r($records); 
//mssql_next_result($result);下一个结果集,当等于FALSE的时候下一个就是输出参数 
echo $b; 
echo $val; 
?>

下面这些是从别的地方看到的。
小麻烦
我们按照惯例使用了一个MS Sql Server的存储过程procA,它给出了一个输出参数nReturn,
而且返回了一个结果集。
在如何让PHP调用这个procA的时候,我们遭遇了一点小麻烦。
鱼肉和熊掌不可兼得:
我们本来希望这样的代码能够既得到输出参数,又得到返回的结果集:
// 初始化要传进存储过程的参数们: 
$nYear = 2004; 
$nPageSize = 20; 
$nPageNo = 1; 
// Initializes a stored procedure: 
$stmt = mssql_init("proc_stat_page", $db_mssql->Link_ID); 
// 绑定输入参数: 
mssql_bind($stmt, "@nReturn", $nReturn, SQLINT4, TRUE); 
mssql_bind($stmt, "@nYear", $nYear, SQLINT4); 
mssql_bind($stmt, "@nPageSize", $nPageSize, SQLINT4); 
mssql_bind($stmt, "@nPageNo", $nPageNo, SQLINT4); 
// 执行存储过程,得到QueryID: 
$db_mssql->Query_ID = mssql_execute($stmt,false);

虽然得到了结果集,但是,这样$nReturn参数是拿不到输出参数的。
如果把最后一句话改为:
$db_mssql->Query_ID = mssql_execute($stmt,true);
输出参数倒是拿到了,结果集又没有了。
好像是一个鱼肉和熊掌不可兼得的样子。
难道PHP连这个都做不到?PHP手册中也没有讲这个问题。
来自于PHP维护者的解释:
原本我们这种调用办法是PHP 4.3版本之前肯定是支持的。
“但是,自从PHP 4.3版本之后,”他们说,“为了能够兼容存储过程返回多个结果集,PHP改变这个特性。”

“如果你不需要结果集,你应该设置mssql_execute的第二个可选参数为TRUE,这样mssql_execute方法之后你就可以得到输出参数了。”

“如果你需要返回的结果集们,你应该为每一个结果集调用一次mssql_next_result。在最后一个结果集返回之后,你再调用mssql_next_result就会得到返回值FALSE,这时候,你就可以访问输出参数了。”
解决:
在最后我们补上一句话
// After the last result has been returned the return value will have the value returned by the stored procedure.
mssql_next_result($db_mssql->Query_ID);
立刻,魔法生效了:
PHP填充了正确的输出参数到$nRetVal里。

PHP 相关文章推荐
将数字格式的计算结果转为汉字格式
Oct 09 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
深入理解PHP中的Session和Cookie
Jun 21 PHP
php单文件版在线代码编辑器
Mar 12 PHP
php删除文本文件中重复行的方法
Apr 28 PHP
微信公众平台DEMO(PHP)
May 04 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
用PHP写的一个冒泡排序法的函数简单实例
May 26 PHP
Yii核心验证器api详解
Nov 23 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 PHP
PHP7变量处理机制修改
Mar 09 PHP
php引用传递
Apr 01 PHP
php实现文件下载更能介绍
Nov 23 #PHP
php 定义404页面的实现代码
Nov 19 #PHP
php中的注释、变量、数组、常量、函数应用介绍
Nov 16 #PHP
apache php模块整合操作指南
Nov 16 #PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 #PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 #PHP
PHP中文分词 自动获取关键词介绍
Nov 13 #PHP
You might like
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
windows下ipython的安装与使用详解
2016/10/20 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
python中正则表达式与模式匹配
2019/05/07 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
python中有帮助函数吗
2020/06/19 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
大学生最常用的自我评价
2013/12/07 职场文书
综合实践活动方案
2014/02/14 职场文书
高中学生期末评语
2014/04/25 职场文书
职位说明书范文
2014/05/07 职场文书
干部鉴定材料
2014/05/18 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android