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 相关文章推荐
一个oracle+PHP的查询的例子
Oct 09 PHP
php 在线打包_支持子目录
Jun 28 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
php错误、异常处理机制(补充)
May 07 PHP
精美漂亮的php分页类代码
Apr 02 PHP
PHP flush()与ob_flush()的区别详解
Jun 03 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
PHP设置进度条的方法
Jul 08 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
PHP通过文件保存和更新信息的方法分析
Sep 12 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 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使用curl详细解析及问题汇总
2016/08/11 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
python实现中文转换url编码的方法
2016/06/14 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
《狐假虎威》教学反思
2014/02/07 职场文书
电话客服工作职责
2014/07/27 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
再谈python_tkinter弹出对话框创建
2022/03/20 Python
java版 联机五子棋游戏
2022/05/04 Java/Android