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 日期时间处理函数小结
Dec 18 PHP
PHP技术开发技巧分享
Mar 23 PHP
PHP面向对象概念
Nov 06 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
ThinkPHP处理Ajax返回的方法
Nov 22 PHP
php提交表单发送邮件的方法
Mar 20 PHP
php实现encode64编码类实例
Mar 24 PHP
Yii2单元测试用法示例
Nov 12 PHP
浅谈PHP5.6 与 PHP7.0 区别
Oct 09 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
PHP开发API接口签名生成及验证操作示例
May 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数据库连接
2006/10/09 PHP
php 中include()与require()的对比
2006/10/09 PHP
php strcmp使用说明
2010/04/22 PHP
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
Python+django实现简单的文件上传
2016/08/17 Python
Python应用库大全总结
2018/05/30 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
django 取消csrf限制的实例
2020/03/13 Python
Django如何批量创建Model
2020/09/01 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
庆中秋节主题活动方案
2014/02/03 职场文书
工地标语大全
2014/06/18 职场文书
画展邀请函
2015/01/31 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python