Хранимая процедура - хотелось бы прочитать параметр OUTPUT и select-resultset - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть следующая хранимая процедура:

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 в 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);
}

введите описание изображения здесь

введите изображениеописание здесь

1 Ответ

0 голосов
/ 24 сентября 2019

Я хотел бы поделиться окончательным результатом о том, как я преодолел проблему и нашел решение.

Сохраненная процедура 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();
    }

Я надеюсь, что кто-то найдет этоответ полезен;конечно открыты для дальнейших улучшений:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...