首先安装扩展

windows

分为两个步骤

  1. 找到对应自己PHP版本的pdo扩展,下载解压出来,并且在php.ini里面启用扩展,需要注意的问题是php版本以及是否为安全版本
  2. 下载 ODBC Driver https://docs.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-2017,这个没啥注意的,你是啥系统就下载啥安装包就行

linux 和 windows差不多,安装扩展的话直接可以用pecl

当你成功加载了可以在phpinfo()里面看到,当然了,如果你安装扩展这些都有诸多问题都话,~你可真拉稀。

thinkphp操作sqlsrv储存过程

我使用的tp版本是5.0和操作多个数据库,希望能对你有所帮助

配置config文件

 // 账号数据库
  'UserDBConn' => [
    'type'      => 'sqlsrv',
    // 服务器地址
    'hostname'    => '139.129.1.1',
    // 数据库名
    'database'    => 'DB3',
    // 用户名
    'username'    => 'xxxx',
    // 密码
    'password'    => 'tt123!@#',
    // 端口
    'hostport'    => '5188'
  ],
  // 金币数据库
  'ScoreDBConn' => [
    'type'      => 'sqlsrv',
    // 服务器地址
    'hostname'    => '139.129.1.1',
    // 数据库名
    'database'    => 'DB2',
    // 用户名
    'username'    => 'xxxx',
    // 密码
    'password'    => 'tt123!@#',
    // 端口
    'hostport'    => '5188'
  ],
  // 记录数据库
  'RecordDBConn' => [
    'type'      => 'sqlsrv',
    // 服务器地址
    'hostname'    => '139.129.1.1',
    // 数据库名
    'database'    => 'DB1',
    // 用户名
    'username'    => 'xxxx',
    // 密码
    'password'    => 'tt123!@#',
    // 端口
    'hostport'    => '5188'
  ],

修改thinkphp/library/think/Model.php

在末尾追加

 /**
   * @param $DbconnName
   */
  protected function Dbconn($DbconnName){

    try{
      $conn = Db::connect($DbconnName);
    }catch (\InvalidArgumentException $e){
      echo '连接异常';
      die;
    }
    return $conn;
  }

添加模型

Agent.php

查询和增删改都可以调用query,如果你没有想要获取的结果集的话可以调用execute()。

query()有一个弊端,如果你的绑定参数的形式(非参数绑定)是直接写进sql的话,他有可能会判断你这个不是一个储存过程;
具体实现请查看thinkphp/library/think/db/Connection.php:368行,当然也不会有结果集返回。

你也可以用调用procedure(),这个方法调用的话就一定会返回结果集。

起初我就是这个问题,并没有采用绑定参数的形式提交,直接写sql,就获取不到结果集,后来我在我的sql提行里面加入了SET NOCOUNT ON;,才能勉强拿到返回,在文章最后我给出了我最开始获取的结果集的方案例子,但是真的拉稀,你们可以看看,不要吐槽。

class Agent extends Model
{
  public $Dbname = 'UserDBConn';
  public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)
  {
    $conn = $this->Dbconn($this->Dbname);
    try{
      $TotalCount = 0;
      $res = $conn::query('exec [dbo].[Agent_GetAgentList] :agentId,:strAccount,:strSuperior,:iPageIndex,:pagesize,:TotalCount', [
        'agentId' => $agentId,
        'strAccount' => [$strAccount, PDO::PARAM_STR],
        'strSuperior' => [$strSuperior, PDO::PARAM_STR],
        'iPageIndex' => [$iPageIndex, PDO::PARAM_INT],
        'pagesize' => [$pagesize, PDO::PARAM_INT],
        'TotalCount' => [$TotalCount, PDO::PARAM_INPUT_OUTPUT],
      ]);
    }catch (PDOException $e)
    {
      return false;
    }
    return $res;
  }
}

最初的Agent.php

很显然 这里并不会获取到@AgentID 以及 @TotalCount;他只会返回Agent_GetAgentList的结果集

public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)
  {
    $conn = $this->Dbconn($this->Dbname);
    try{

      $res = $conn->query('
        SET NOCOUNT ON;
        declare @AgentID int;
        declare @TotalCount int;
        exec [dbo].[Agent_GetAgentList] '.$agentId.',\''.$strAccount.'\',\''.$strSuperior.'\','.$iPageIndex.','.$pagesize.',@TotalCount output;
        select @AgentID as AgentID,@TotalCount as TotalCount
        ');
    }catch (PDOException $e)
    {
      return false;
    }
    return $res;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

thinkphp调用sqlserver储存过程返回多个结果集的更多相关文章

  1. ThinkPHP 5.x远程命令执行漏洞复现

    这篇文章主要介绍了ThinkPHP 5.x远程命令执行漏洞复现的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. thinkPHP数据查询常用方法总结【select,find,getField,query】

    这篇文章主要介绍了thinkPHP数据查询常用方法,结合实例形式总结分析了select,find,getField,query等方法进行数据库查询操作的具体操作步骤与相关实现技巧,需要的朋友可以参考下

  3. ThinkPHP框架实现的邮箱激活功能示例

    这篇文章主要介绍了ThinkPHP框架实现的邮箱激活功能,结合实例形式分析了thinkPHP使用class.smtp.php及class.phpmailer.php类文件进行邮件发送实现激活功能的具体操作技巧,需要的朋友可以参考下

  4. thinkPHP多表查询及分页功能实现方法示例

    这篇文章主要介绍了thinkPHP多表查询及分页功能实现方法,结合具体实例形式分析了thinkPHP多表查询以及查询结果的分页显示相关实现技巧,需要的朋友可以参考下

  5. 基于ThinkPHP实现的日历功能实例详解

    这篇文章主要介绍了基于ThinkPHP实现的日历功能,结合实例形式详细分析了基于thinkPHP实现日历功能的相关界面布局、数据库操作与日期时间运算相关技巧,需要的朋友可以参考下

  6. thinkphp 抓取网站的内容并且保存到本地的实例详解

    这篇文章主要介绍了thinkphp 抓取网站的内容并且保存到本地的实例详解的相关资料,需要的朋友可以参考下

  7. thinkphp分页实现效果

    大量数据的显示就需要对内容进行分页,本文章就是就是介绍thinkphp分页进行整理,有需要的朋友一起来了解一下。

  8. 老生常谈php中传统验证与thinkphp框架(必看篇)

    下面小编就为大家带来一篇老生常谈php中传统验证与thinkphp框架(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. thinkphp查询,3.X 5.0方法(亲试可行)

    下面小编就为大家带来一篇thinkphp查询,3.X 5.0方法(亲试可行)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. thinkPHP自动验证、自动添加及表单错误问题分析

    这篇文章主要介绍了thinkPHP自动验证、自动添加及表单错误问题分析,结合案例形式分析了thinkPHP自动完成机制的相关使用技巧与注意事项,需要的朋友可以参考下

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部