PHP使用PDO调用sqlserver存储过程记录【分享个通用方法】

2 篇文章 0 订阅
1 篇文章 0 订阅

由于业务这边存储过程一直在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',
],
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值