php - PHP存储过程执行不完整
问题描述
嗨我有一个存储过程,里面有一个while,它接收2个参数来表示while的条件。我让它像一个 for 一样工作。如果我从 SQL 执行它,它工作得很好,但如果我从 PHP 调用它,while 不尊重条件并突然结束。
while 在每一行中插入一个迭代器编号,例如
1,a,b
2,a,b
3,a,b
等等。如果我将迭代设置为 1 到 1000,则循环会在每次执行 SP 时在不同的交互中无缘无故地停止。
我有一个尝试/捕获,但我无法检测到错误。
我确定所有参数都是正确的。
有人可以帮我检测为什么存储过程不能正确结束吗?
我正在使用 PDO 访问 SQL Server。
入库流程:
ALTER procedure [dbo].[sp_AddSealsFromPurchase]
@initialFolio int,
@finalFolio int,
@userDelivery_ID varchar(50),
@userReceives_ID varchar(50),
@color nvarchar(10),
@supplier_ID int,
@requisition_ID int,
@office_ID int,
@reference nvarchar(50)
as
begin
declare @now datetime;
set @now = getdate();
while @initialFolio<=@finalFolio Begin
begin try
INSERT into Seals (SealNo,SealType,Color,Supplier_ID,[Source],Office_ID,Requisition_ID,Reference)
Values (@initialFolio,1,@color,@supplier_ID,1,@office_ID,@requisition_ID,@reference)
INSERT INTO StatusSeal(Seal_ID,Status_ID,UserDelivery_ID,UserReceives_ID,StatusSeal_Date,UserDeliveryType,UserReceivesType)
Values(@@Identity,1,@userDelivery_ID,@userReceives_ID,@now,1,1)
set @initialFolio = @initialFolio +1;
end try
begin catch
set @initialFolio = @initialFolio +1;
end catch
end
end
PHP:
function AddSealsFromPurchase($Data){
session_start();
$cnx=$this->connectSqlSrv();
$sth=$cnx->prepare("Exec sp_AddSealsFromPurchase ?,?,?,?,?,?,?,?,?");
$sth->bindParam(1, $Data["InitialFolio"]);
$sth->bindParam(2, $Data["FinalFolio"]);
$sth->bindParam(3, $Data["UserDelivery"]);
$sth->bindParam(4, $_SESSION['SESSINFOSEAL']['User_Usr']);
$sth->bindParam(5, $Data["Color"]);
$sth->bindParam(6, $Data["Supplier_ID"]);
$sth->bindParam(7, $Data["Requisition_ID"]);
$sth->bindParam(8, $_SESSION['SESSINFOSEAL']['Ofice_ID']);
$sth->bindParam(9, $Data["Reference"]);
session_write_close();
$retval=$this->ExecuteNoQuery($sth);
return json_encode($retval);
}
public function connectSqlSrv(){
try{
$dbCnx = new PDO("sqlsrv:Server=$this->server;Database=$this->db", $this->usr, $this->psw);
$dbCnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $dbCnx;
}
catch(PDOException $e){
echo $e;
die();
return null;
}
}
public function ExecuteNoQuery($sth)
{
$r=array('data'=>false,
'error'=>false,
'r'=>'');
try {
$sth->execute();
if ($r['r'] = $sth->rowCount()) {
$r['data'] = true;
}
} catch (PDOException $e) {
$r['error']=true;
$r['r'] = $e->getMessage();
}
return $r;
}
解决方案
推荐阅读
- sql-server - 内部带有 CASE 语句的用户定义函数
- ruby-on-rails - Ruby:将数据结构转换为 Excel 工作表
- javascript - 单击按钮时填写必填字段
- git-checkout - git --git-dir checkout 和 git checkout 的区别
- java - 如何杀死在后台运行的线程 - Java?
- java - 如何使用http请求获取特定数据?
- javascript - Angular 2 使用 ngfor 获取 json 数据
- mule - Mule 4.1.2 自定义连接器错误
- regex - 前瞻前的懒惰正则表达式:不使用`.+?`
- c++ - 无法从 cpp 代码将参数传递给 R 函数