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树的代码,可以嵌套任意层
Oct 09 PHP
php $_ENV为空的原因分析
Jun 01 PHP
PHP 程序员应该使用的10个组件
Oct 31 PHP
PHP实现的简单日历类
Nov 29 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
PHP中Cookie的使用详解(简单易懂)
Apr 28 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
Aug 01 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
laravel 错误处理,接口错误返回json代码
Oct 25 PHP
PHP实现爬虫爬取图片代码实例
Mar 03 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中的全局变量
2016/06/17 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
php输出形式实例整理
2020/05/05 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
package.json文件配置详解
2017/06/15 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
精选奢华:THE LIST
2019/09/05 全球购物
高二英语教学反思
2014/01/19 职场文书
运动会广播稿500字
2014/01/28 职场文书
手机银行营销方案
2014/03/14 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
写字楼租赁意向书
2014/07/30 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书