- 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