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
php批量删除数据
Jan 18 PHP
php str_pad 函数用法简介
Jul 11 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 PHP
在html文件中也可以执行php语句的方法
Apr 09 PHP
Zend Framework动作助手Url用法详解
Mar 05 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 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中取得URL的根域名的代码
2011/03/23 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
详解Python中的多线程编程
2015/04/09 Python
Python中splitlines()方法的使用简介
2015/05/20 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
个人找工作自荐信格式
2013/09/21 职场文书
财务人员担保书
2014/05/13 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
事业单位年度考核评语
2014/12/31 职场文书
个人工作表现自我评价
2015/03/06 职场文书
教师素质教育心得体会
2016/01/19 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
JUnit5常用注解的使用
2021/07/02 Java/Android
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers