美文网首页
php 调用sql server 的存储过程获得返回结果

php 调用sql server 的存储过程获得返回结果

作者: 六分 | 来源:发表于2018-12-21 12:45 被阅读0次
    • php调用 (见下方)
    • execsql方法(见下方)
    • sql server 存储过程(见下方)

    php 调用

     $param = array(1);//值传入输入参数   输出参数不能输入
     $ifRetVal = 1;
    $sql_2='
      declare @msg varchar(20),@returnValue int=0;
      exec  @returnValue=Pro_test_php  @UserID = ?,@msg=?;   --不要output  如果输出参数,名称相同,则不需要declare 
     select @returnValue;--获得返回值  ';
      $s=CommonUtils::execsql($sql_2, $param, $ifRetVal);
    

    execsql方法

      public  function execsql($sql, ...$args)
        {
    
            //$T = tools::inst();// 你的消息处理函数和工具函数
    
            // 判断 $args 是否数组
            if (!is_array($args)) {
                // 消息处理
            }
    
            // 判断 $args 成员数
            if (count($args) !== 2) {
                // 消息处理
            }
    
            // 取参数
            $param = $args[0];
            $mark = $args[1];
    
            // 判断 $param 是否数组
            if (!is_array($param)) {
                // 消息处理
            }
    
            // 判断 $mark
            if ($mark !== 0 && $mark !== 1) {
                // 消息处理
            }
    
            // 判断 $param 内参数个数与 $sql 中占位符的数量
            $arrCount = count($param); // 数组成员数
            //$charCount = count($T::charPoscheck($sql, '?')); // sql语句中问号的数量
            //$charCount = 2; // sql语句中问号的数量
            $charCount = substr_count($sql, '?');
            // 只要结果集不要返回值时,参数个数必须与sql语句中的占位符数量相等
            if ($mark === 0 && $arrCount !== $charCount) {
                // 消息处理
            }
            // 同时需要结果集和返回值时,sql语句中的占位符比参数个数多一个(多一个出参,必须放在末尾)
            if ($mark === 1 && ($arrCount + 1 !== $charCount)) {
                // 消息处理
            }
    
            //$dbh = $this->getconn('web');// 你的PDO连接
            $dbh = DB::connection()->getPdo();
            // 预定义语句,把 $sql 语句告诉数据库
    
            $stmt = $dbh->prepare($sql, array($dbh::ATTR_CURSOR => $dbh::CURSOR_SCROLL));
    
            // 循环绑定入参
            for ($i = 0; $i < $arrCount; ++$i) {
                $stmt->bindParam($i + 1, $param[$i], $dbh::PARAM_STR);
            }
    
            // 绑定出参(这就是为何要判断参数个数与SQL语句中占位符数量的原因)
            $retVal = null;
            if ($mark === 1) {
                $stmt->bindParam($arrCount + 1, $retVal, $dbh::PARAM_STR | $dbh::PARAM_INPUT_OUTPUT, 100);
            }
    
            // 执行并判断结果
            if ($stmt->execute() === false) {
                // 错误处理
            }
    
            $ret = array();
            $res = null;
    
            // 取得结果集
            while ($res = $stmt->fetchAll($dbh::FETCH_NUM)) {
                $ret = $res;
                $stmt->nextRowset();
            }
    
            // 判断结果集
            $retCount = count($ret);
            if ($retCount < 1) {
                $ret = array('nothing');
            }
    
            // 将返回值压入结果集数组末尾
            if ($mark === 1) {
                array_push($ret, $retVal);//文本
            }
    
            // 返回
            return $ret;
        }
    

    sql server 存储过程

    USE [MNE]
    GO
    /****** Object:  StoredProcedure [dbo].[Pro_test_php]    Script Date: 2018/12/21 10:43:24 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET NOCOUNT ON
    GO
    ALTER procedure [dbo].[Pro_test_php](@UserID int,@Msg varchar(100) output)
    as
    begin
        
        if @UserID>0 
            begin
                set @Msg='成功!'
                return 1
            end
    
        set @Msg='失败!'
        return 0
    end
    
    

    相关文章

      网友评论

          本文标题:php 调用sql server 的存储过程获得返回结果

          本文链接:https://www.haomeiwen.com/subject/dhemkqtx.html