【问题标题】:Getting output from stored procedure in PHP从 PHP 中的存储过程获取输出
【发布时间】:2019-02-08 15:46:28
【问题描述】:

我现在在php中调用一个存储过程,该过程的第三个参数是一个OUT参数所以它应该得到输出

当我运行这个时:

function createNameRecord($firstName,$lastName){
    try{
        $sql = "CALL schema.CREATE_RECORD(?,?,?)";
        $values = [$firstName,$lastName,$returnID];
        return DB::connection('odbc')->select($sql,$values);
        dd($returnID);
    }catch(Exception $e){
        return false;
    }
}

程序正常运行并重新加载页面,当我检查数据库时,记录已成功创建。但是,我需要作为创建记录 ID 的输出变量,并且我需要将其返回给随后运行的函数。

因此,既然它运行,成功创建记录并重新加载页面,那么我如何转储输出 $returnID 以便我可以验证它是否存储了我返回的 ID?上面的转储和死机不起作用,可能是因为页面重新加载。

验证退货 ID 的最佳方法是什么?

【问题讨论】:

  • 如果您只是在调试,请阻止重定向,并回显变量/退出。如果您需要在页面加载之间保留该字段,请将其存储在会话中。见Flash Messages
  • 您在到达 dd($returnID); 之前返回把那一行放在前面,或者把第 5 行的 return 去掉,放在第 6 行的开头。
  • @Millar248 我必须在获取返回 ID 之前执行 proc,所以你是说删除“return”并将其放在转储/死之前?
  • 我只是说,据我所知,return 结束了一个函数。我不知道“dd()”在做什么,但是如果您的代码正在运行,并且您希望 dd 发送回数据,我怀疑它会在调用 return 后这样做。如果是我,我会这样做:尝试 { //... DB::connection('odbc')->select($sql,$values); dd($returnID); }catch(Exception $e){ return false; } 返回真;
  • @FrankerZ 命中此函数的控制器最后使用 return back() 并且表单正在使用提交按钮提交。能否举例说明如何执行此过程并在成功后将 ID 闪烁在消息中?

标签: php sql db2


【解决方案1】:

我是社区的新手,不完全知道如何指导您,但如果您尝试mysqli_real_query() 并按照文档所述检索结果:

对数据库执行单个查询,其结果可以是 使用 mysqli_store_result() 检索或存储或 mysqli_use_result() 函数。

【讨论】:

    【解决方案2】:

    一旦您的函数看到return,该函数将不再执行该行之后的任何代码。在这种情况下,dd($returnID); 永远不会被执行。如果你只是调试,只需删除return,然后让dd() 输出/死:

    function createNameRecord($firstName,$lastName){
        try{
            $sql = "CALL schema.CREATE_RECORD(?,?,?)";
            $values = [$firstName,$lastName,$returnID];
            DB::connection('odbc')->select($sql,$values);
            dd($returnID);
        }catch(Exception $e){
            return false;
        }
    }
    

    在这种情况下,您并不关心返回值(无论调用createNameRecord),因为您只希望脚本结束/终止。

    如果它仍在重新加载页面,那么你的 catch 语句可能正在执行,你也应该调试它:

    function createNameRecord($firstName,$lastName){
        try{
            $sql = "CALL schema.CREATE_RECORD(?,?,?)";
            $values = [$firstName,$lastName,$returnID];
            DB::connection('odbc')->select($sql,$values);
            dd($returnID);
        }catch(Exception $e){
            dd($e);
        }
    }
    

    【讨论】:

    • 我确实尝试过,但它仍然刷新页面,我认为这是我的问题。驱动这个的控制器使用 return back() 如果这会有所不同,并且表单作为输入提交按钮。因此,它仍然可以通过您的更改成功创建记录,但页面重新加载并且我的 ID 没有被转储
    • 你是对的,它仍然插入记录,但我在过程中得到一个无效的游标状态,它把 $returnID 设置为 null
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多