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 相关文章推荐
杏林同学录(一)
Oct 09 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
php错误、异常处理机制(补充)
May 07 PHP
PHP中的日期加减方法示例
Aug 21 PHP
php使用PDO操作MySQL数据库实例
Dec 30 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
php 数组元素快速去重
May 05 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
php 可变函数使用小结
Jun 12 PHP
PHP后台备份MySQL数据库的源码实例
Mar 18 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 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/10/09 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
php高级编程-函数-郑阿奇
2011/07/04 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
前端微信支付js代码
2016/07/25 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
Python文件夹与文件的操作实现代码
2014/07/13 Python
Python字符串替换实例分析
2015/05/11 Python
python xml解析实例详解
2016/11/14 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
常见的软件开发流程有哪些
2015/11/14 面试题
酒店服务与管理毕业生求职信
2013/11/02 职场文书
自我鉴定书
2014/03/24 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
房屋质量投诉书
2015/07/02 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
公司酒会致辞
2015/07/30 职场文书
青年教师听课心得体会
2016/01/15 职场文书