首页 > 解决方案 > 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;
    }

标签: phpsql-serverstored-procedures

解决方案


推荐阅读