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 相关文章推荐
BBS(php &amp; mysql)完整版(三)
Oct 09 PHP
php中利用post传递字符串重定向的实现代码
Apr 21 PHP
php 抽象类的简单应用
Sep 06 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
php写的AES加密解密类分享
Jun 20 PHP
PHP单例模式详细介绍
Jul 01 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
Jan 29 PHP
PHP xpath()函数讲解
Feb 11 PHP
浅谈PHP各环境下的伪静态配置
Mar 13 PHP
一文看懂PHP进程管理器php-fpm
Jun 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如何透过ODBC来存取数据库
2006/10/09 PHP
用PHP查询域名状态whois的类
2006/11/25 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
PHP中list方法用法示例
2016/12/01 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
python简单实现获取当前时间
2016/08/27 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
幼儿园中秋节活动方案
2014/02/06 职场文书
食品安全工作实施方案
2014/03/26 职场文书
一份文言文检讨书
2014/09/13 职场文书
个人作风建设自查报告
2014/10/22 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书
教你用python控制安卓手机
2021/05/13 Python