- 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)
{
if (!is_array($args)) {
}
if (count($args) !== 2) {
}
$param = $args[0];
$mark = $args[1];
if (!is_array($param)) {
}
if ($mark !== 0 && $mark !== 1) {
}
$arrCount = count($param);
$charCount = substr_count($sql, '?');
if ($mark === 0 && $arrCount !== $charCount) {
}
if ($mark === 1 && ($arrCount + 1 !== $charCount)) {
}
$dbh = DB::connection()->getPdo();
$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);
}
$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
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