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 相关文章推荐
php5数字型字符串加解密代码
Apr 24 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
PHP sprintf()函数用例解析
May 18 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
php 字符串压缩方法比较示例
Jan 23 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
PHP常用的三种设计模式
Feb 17 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
Apr 25 PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 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面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
浅谈php和.net的区别
2014/09/28 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
用jscript实现新建word文档
2007/06/15 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
python 类详解及简单实例
2017/03/24 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
python 同时运行多个程序的实例
2019/01/07 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
Python字典底层实现原理详解
2019/12/18 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
测绘工程个人的自我评价
2013/11/10 职场文书
2014庆六一活动方案
2014/03/02 职场文书
庆国庆活动总结
2014/08/28 职场文书
先进典型事迹材料
2014/12/29 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
反腐倡廉观后感
2015/06/08 职场文书
考试后的感想
2015/08/07 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android