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 相关文章推荐
PHP截取中文字符串的问题
Jul 12 PHP
用PHP编程语言开发动态WAP页面
Oct 09 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
Dec 02 PHP
台湾中原大学php教程孙仲岳主讲
Jan 07 PHP
php用数组返回无限分类的列表数据的代码
Aug 08 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
浅谈PHP中关于foreach使用引用变量的坑
Nov 14 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 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使用Imagick生成图片的方法
2015/07/31 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
浅谈Vue.js
2017/03/02 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
Python操作json的方法实例分析
2018/12/06 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
前台接待岗位职责
2013/12/03 职场文书
简短证婚人证婚词
2014/01/09 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
司考复习计划
2015/01/19 职场文书
工作失职自我检讨书
2015/05/05 职场文书
教师节联欢会主持词
2015/07/04 职场文书
导游词之介休绵山
2019/12/31 职场文书
Python OpenGL基本配置方式
2022/05/20 Python