从 PHP 中的存储过程获取输出

Posted

技术标签:

【中文标题】从 PHP 中的存储过程获取输出【英文标题】:Getting output from stored procedure in 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 闪烁在消息中? 【参考方案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

以上是关于从 PHP 中的存储过程获取输出的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JDBC 中的存储过程中获取输出

从 php 中的存储过程中获取值

如何从存储过程的表中的列中获取输出参数

如何获取存储过程以输出从 SQL*Plus 中的 select 语句返回的表?

从java中的mysql存储过程中获取参数

如何从存储过程中获取结果,过程运行良好但 php 返回 null