PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】


Posted in PHP onOctober 07, 2017

本文实例讲述了PHP基于PDO调用sqlserver存储过程的方法。分享给大家供大家参考,具体如下:

由于业务这边存储过程一直在sqlserver上面,所以要用php去调用它,然而我们本地的是windows,而线上又是linux,一开始使用Yii框架的一些机制去调用发现在本地一直都是好的然而到线上就不行了,找了很多方案,最后找到了pdo这种方案,而本地使用的驱动是sqlsrv线上是dblib所以需要注意下链接pdo时的驱动形式,在取结果集的时候注意windows和linux好像有所不同,在我加上set nocount on后win若果直接取结果就可以拿到最后的,然而放到linux就没了,气死人的说,索性最后我把所有的都取一遍;

分享整理后的一个方法:

class StoredProcHelper
{
  private static $type = [
   'integer'=>PDO::PARAM_INT,
   'string'=>PDO::PARAM_STR,
   'null'=>PDO::PARAM_NULL,
   'boolean'=>PDO::PARAM_BOOL
  ];
  private $sql = '';//此变量在下方说明
  private $params = [];//此变量在下方说明
  private $connect_info;//此变量在下方说明
  private $pdo_connect;
  public function __construct($connect_info,$sql,$params){
    $this->sql = 'SET NOCOUNT ON;'.$sql;
    $this->params = $params;
    $this->connect_info = $connect_info;
    if(!empty($this->connect_info->dsn) && !empty($this->connect_info->username) && !empty($this->connect_info->password)){
      $this->pdo_connect = new PDO($this->connect_info->dsn,$this->connect_info->username, $this->connect_info->password);
    }
  }
  public function ExecuteProc(){
    $link = $this->pdo_connect->prepare($this->sql);
    foreach ($this->params as $key => $value){
      $link->bindParam($key,$value,self::$type[strtolower(gettype($value))]);
    }
    $link->execute();
    $i = 1;
    $res[0] = $link->fetchAll();
    while($link->nextRowset()){
      $res[$i] = $link->fetchAll();
      $i++;
    }
    return $res;
  }
}

使用举例:

public static function Example($connect_info,$mobile){
    $sql='declare @customParam int;exec you_proc @Mobile = :mobile,@OutParam=@customParam out;select @customParam as outName;';
    $params = [
      ':mobile'=>$mobile
    ];
    $pdo = new StoredProcHelper($connect_info,$sql,$params);
    $res = $pdo->ExecuteProc();
    var_dump($res);
  }

变量$sql和$params的形式如例子中表现的;

变量$connect_info的形式如下【因为本人是在Yii框架 下使用的,所以以此变量是直接根据Yii来获取数据库链接配置来进行的,如果自己有所不同可以自行更改形式以及赋值形式,在框架中方便的是不同环境下直接获取配置能分别获取到是sqlsrv和dblib,不需要自行去更改】:

[
  'dsn' => 'sqlsrv:Server=xxxxxxxxxx;Database=xxxxx',
  'username' => 'xxxxx',
  'password' => 'xxxxxxxxxxxxxxxxxxxx',
  'charset' => 'utf8',
]
//或
[
  'dsn' => 'dblib:host=xxxxxxxxxx;dbname=xxxxx',
  'username' => 'xxxxx',
  'password' => 'xxxxxxxxxxxxxxxxxxxx',
  'charset' => 'utf8',
],

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP与已存在的Java应用程序集成
Oct 09 PHP
对Session和Cookie的区分与解释
Mar 16 PHP
PHP Smarty生成EXCEL文档的代码
Aug 23 PHP
PHP中PDO基础教程 入门级
Sep 04 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 #PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 #PHP
php判断文件上传图片格式的实例详解
Sep 30 #PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 #PHP
PHP基于自定义函数实现的汉字转拼音功能实例
Sep 30 #PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 #PHP
php使用curl下载指定大小的文件实例代码
Sep 30 #PHP
You might like
一个PHP日历程序
2006/12/06 PHP
PHP实现货币换算的方法
2014/11/29 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
php封装一个异常的处理类
2017/06/08 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
Python中%r和%s的详解及区别
2017/03/16 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
python 文件转成16进制数组的实例
2018/07/09 Python
python对常见数据类型的遍历解析
2019/08/27 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
触电现场处置方案
2014/05/14 职场文书
销售竞赛活动方案
2014/08/23 职场文书
公司门卫岗位职责
2015/04/13 职场文书
周一问候语大全
2015/11/10 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
python数据处理之Pandas类型转换
2022/04/28 Python