【问题标题】:Stored procedure - would like to read OUTPUT parameter and select-resultset存储过程 - 想读取 OUTPUT 参数和选择结果集
【发布时间】:2019-09-22 20:36:28
【问题描述】:

我有以下存储过程:

CREATE DEFINER=`CNX`@`%` PROCEDURE `sp_Facturatie_OpenstaandeBetalingen_Get`(OUT spResult varchar(200))
BEGIN

DECLARE exit handler for SQLEXCEPTION
 BEGIN
  GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
   @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
  SET spResult = left(CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text),200);
 END;

SET spResult = 'TRUE';


/*SELECT @spResult;*/

SELECT *
FROM   Web_tblAfspraakBetalingen AB
       LEFT OUTER JOIN Web_tblBetaalStatus BS
                    ON AB.betalingbetaalstatusid = BS.betaalstatusid
       LEFT OUTER JOIN Web_tblBetaalMethode BM
                    ON AB.betalingbetaalmethodeid = BM.betaalmethodeid
WHERE  BS.betaalstatusomschrijving <> 'Betaald'
ORDER  BY betalingid ASC;

END

我想用 PHP 中的 MySqli 以 Procedural 风格调用 PHP 中的这个存储过程。 在 PHP 中尝试了很多不同的代码。有人可以建议我如何做到最好吗?

我试过的代码:

$link = mysqli_connect($host, $gebruiker, $wachtwoord, $database)  or die("Query fail: " . mysqli_error());
$call = mysqli_prepare($link, 'sp_Facturatie_OpenstaandeBetalingen_Get(@ResultText)');
mysqli_stmt_execute($call);
$select = mysqli_query($link, 'SELECT @ResultText');
$result = mysqli_fetch_assoc($select);
$ResultText = $result['@ResultText'];

if ($ResultText === 'TRUE')
{
    echo $ResultText;
    die();
}

if ($result)
{
    $rowcount = mysqli_num_rows($result);
    echo $rowcount;
    while ($row = mysqli_fetch_array($result))
    {
        //BetalingID, BetalingAfspraakID, BetalingDatum, BetalingBedrag, BetalingBetaalMethodeID, BetalingBetaalStatusID, BetalingCreatedOn, BetalingUpdatedOn, BetaalStatusID, BetaalStatusOmschrijving, BetaalMethodeID, BetaalMethodeOmschrijving, id
        $BetalingAfspraakID = $row["BetalingAfspraakID"];
        $BetalingDatum = $row["BetalingDatum"];
        $BetalingBedrag = $row["BetalingBedrag"];
        $BetaalStatusOmschrijving = $row["BetaalStatusOmschrijving"];
        $BetaalMethodeOmschrijving = $row["BetaalMethodeOmschrijving"];

        echo "<tr>";
        echo "<td>";
        echo "<b>Afspraak</b> " . $BetalingAfspraakID . " op " . $BetalingDatum . "</br>";
        echo "Bedrag: " . $BetalingBedrag . " EUR per " . $BetaalMethodeOmschrijving . "</br>";
        echo "Status: " . $BetaalStatusOmschrijving;
        echo "</td>";
        echo "<td>";
        ?>
        <button type="button" class="ButtonStyle" onmousedown="toggleOverlay('OverlayPageAfspraakBetalingen',<?php echo $BetalingAfspraakID ?>)">Bewerken</button>
        <?php
        echo "</td>";
        echo "</tr>";
    }           
    // free result set
    mysqli_free_result($result);
}

enter image description here

enter image description here

【问题讨论】:

  • 你能告诉我们你尝试了什么吗?
  • 在这里查看一些指导stackoverflow.com/questions/3966747/…
  • MYSQL 不支持 OUT 参数。从过程中返回结果或将其设置为变量,然后使用下一个查询进行选择
  • 感谢您的回复@YourCommonSense 常识,但是我不明白您的回复。此外,如果我直接在 mysql 客户端上尝试,它会为我提供一个超参数。请参阅说明中的图片。
  • 请参考链接问题

标签: php stored-procedures mysqli


【解决方案1】:

我想分享一下我是如何克服这个问题并找到解决方案的最终结果。

MySQL 存储过程:

CREATE DEFINER=`CN20100686`@`%` PROCEDURE `sp_Facturatie_OpenstaandeBetalingen_Get`()
BEGIN

Declare spResult nvarchar(200);

DECLARE exit handler for SQLEXCEPTION /*declared an exception handler, which the result is put into a select*/
 BEGIN
   GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
   @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
  SET spResult = left(CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text),200);
  SELECT spResult;

 END;

SELECT  AB.BetalingAfspraakID,
        AB.BetalingDatum,
        Round(AB.BetalingBedrag,2) BetalingBedrag,
        BS.BetaalStatusOmschrijving,
        BM.BetaalMethodeOmschrijving,
FROM   Web_tblAfspraakBetalingen AB
       LEFT OUTER JOIN Web_tblBetaalStatus BS
                    ON AB.betalingbetaalstatusid = BS.betaalstatusid
       LEFT OUTER JOIN Web_tblBetaalMethode BM
                    ON AB.betalingbetaalmethodeid = BM.betaalmethodeid
WHERE  BS.betaalstatusomschrijving <> 'Betaald'
ORDER  BY betalingid ASC;

END

在 PHP 中我做了以下工作:

  • 检查结果集是否返回零行 - 表示已存储 程序执行正确,但没有找到结果,否则
  • 检查结果集是否有一个名为“spResult”的字段。如果是这样,请阅读并 在屏幕上填充结果,否则
  • 根据需要处理结果集。

PHP 示例:

$sproc = 'sp_Facturatie_OpenstaandeBetalingen_Get()';
$result = mysqli_query($link,"CALL " . $sproc) or die("mysqli_query failure: " . mysqli_error());
$rowcount=mysqli_num_rows($result);

    if ($rowcount == 0) {echo "No records found.";}
    if ($result)
    {
        $rowcounter = 'first';
        while ($row = mysqli_fetch_array($result))
        {
            if (substr($row["spResult"],0,5) == 'ERROR')
            {
                echo "Error occured on executing " . $sproc . ": " . $row["spResult"];
                mysqli_free_result($result);
                exit();
            }
            if ($rowcounter == 'first')
            {
                //printing here my table header
                echo "
                     <b>List</b>
                     </br>
                     <table border=1 style='min-width:100%'>
                     <tr>
                        <td width='80%'>
                          Payments:
                       </td>
                       <td width='20%'>
                       </td>
                     </tr>
                     Count open payments: " . $rowcount;
                $rowcounter = 'next';
            }
            $BetalingAfspraakID = $row["BetalingAfspraakID"];
            $BetalingDatum = $row["BetalingDatum"];
            $BetalingBedrag = $row["BetalingBedrag"];
            $BetaalStatusOmschrijving = $row["BetaalStatusOmschrijving"];
            $BetaalMethodeOmschrijving = $row["BetaalMethodeOmschrijving"];

                //display results as you wish
                echo "<tr>";
                echo "<td>";
                echo "<b>Afspraak</b> " . $BetalingAfspraakID . "</br>";
                echo "Amount: " . $BetalingBedrag . "</br>";
                echo "Status: " . $BetaalStatusOmschrijving;
                echo "</td>";
                echo "</tr>";
        }

        // free result set
        mysqli_free_result($result);
    }
    else
    {
        echo "Error occured!" . mysqli_error($link);
        exit();
    }

我希望有人觉得这个答案有用;当然可以进一步改进:)

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 2017-04-23
    • 1970-01-01
    • 2021-12-11
    • 2014-11-25
    • 1970-01-01
    • 2012-12-15
    • 2018-07-28
    • 2014-07-17
    相关资源
    最近更新 更多