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

  • 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

    原文作者:六分
    原文地址: https://www.jianshu.com/p/62812cf33fd9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞