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和ACCESS写聊天室(六)
Oct 09 PHP
第八节--访问方式
Nov 16 PHP
php入门小知识
Mar 24 PHP
php中将数组存到文件里的实现代码
Jan 19 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
使用PHP Socket写的POP3类
Oct 30 PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 PHP
PHP中Trait及其应用详解
Feb 14 PHP
php实时倒计时功能实现方法详解
Feb 27 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
laravel框架中视图的基本使用方法分析
Nov 23 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递归法读取目录及文件的方法
2015/01/30 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
Js的MessageBox
2006/12/03 Javascript
js表头排序实现方法
2015/01/16 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
浅谈js中的bind
2019/03/18 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
Python中文件遍历的两种方法
2014/06/16 Python
python中sets模块的用法实例
2014/09/30 Python
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
Python smallseg分词用法实例分析
2015/05/28 Python
Python读取MRI并显示为灰度图像实例代码
2018/01/03 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
python openssl模块安装及用法
2020/12/06 Python
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
保护环境倡议书
2014/04/14 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
学校社团活动总结
2015/05/07 职场文书
用人单位聘用意向书
2015/05/11 职场文书
php字符串倒叙
2021/04/01 PHP