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文件
Jan 04 PHP
php GD绘制24小时柱状图
Jun 28 PHP
php 异常处理实现代码
Mar 10 PHP
PHP中全面阻止SQL注入式攻击分析小结
Jan 30 PHP
PHP5常用函数列表(分享)
Jun 07 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 PHP
PHP简单遍历对象示例
Sep 28 PHP
php文件上传 你真的掌握了吗
Nov 28 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
Apr 22 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
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
JavaScript中使用构造函数实现继承的代码
2010/08/12 Javascript
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
js数组操作学习总结
2013/11/04 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
python装饰器使用方法实例
2013/11/21 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
高二地理教学反思
2014/01/24 职场文书
超市商业计划书
2014/05/04 职场文书
2014年学习部工作总结
2014/11/12 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
父母教会我观后感
2015/06/17 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书