簡體   English   中英

PHP和MySQL:While循環

[英]PHP & MySQL: While Loop

首先,我是PHP和MySQL的新手,因此我仍然會按程序​​進行編碼。

我正在開發一種應用程序,該應用程序可以進行交易並在一定的到期日向以前進行捐贈的用戶支付應付款。 我有一個功能knapSolveFast2解決了背包問題(其中,數據庫中的一組交易金額加在一起,到期日到期的用戶應得的金額)。 目前,我的演示數據庫如下所示:

在此處輸入圖片說明

如果我當前的日期(現在)= 2017-04-03 11:36:03 = CAST(NOW() AS DATETIME) ,則我的應用程序應遍歷數據庫,從tran_date maturity_date >= 1 monthtran_date (即WHERE maturity_date <= CAST(NOW() AS DATETIME) )。 以發現每個用戶和配對他們在while循環支付給其他用戶tran_amt在其數據庫tran_amt總結了至到期的用戶發現due_amount使用背包功能knapSolveFast2

問題 :在使用第一個while loop找到具有到期付款日期的用戶(2個用戶)之后,我試圖運行一個內部while循環以將每個用戶與tran_amt為所獲取用戶的到期金額的其他用戶tran_amt 這里的問題是,內部while循環僅針對發現的第一個用戶運行,而不適用於第二個用戶。

編碼

<?php
            $servername = "localhost";
            $username = "root";
            $password = "";
            $dbname = "test";

            $connect = @mysqli_connect($servername, $username, $password, $dbname);

            if (mysqli_connect_errno()) {

              die("<pre><h1>Sorry, we are experiencing a little Downtime!</h1></pre>");

            } 

            //include the match controller containing the knapSolveFast2 function
            include('controller/match.php');

            //UPDATE `pendingpair`SET `maturity_date`= DATE_ADD(`tran_date`, INTERVAL 1 MONTH)

            //select user to be paid
            $sql = "SELECT `user_id`, `due_payment` FROM `pendingpair` where `maturity_date` <= CAST(NOW() AS DATETIME) ORDER BY `id` ASC";

            $queryRun = mysqli_query($connect, $sql);
            $num_rows = mysqli_num_rows($queryRun);

            if ($num_rows > 0) {

                while ($row = mysqli_fetch_assoc($queryRun)) {

                    $user_id_due = $row['user_id'];
                    $user_amt_due = $row['due_payment'];

                    print_r($row);

                    /* Perform queries to select users to pay $user_id_due the sum of $user_amt_due; Where:
                    - user to be paid, $user_id_due, is not included in the pairing logic
                    - transacton payment to be chosen, ph_conf = 1,  has been confirmed
                    - transaction has not yet been paired for payment, tran_paired_status = 0
                    - transactions have not been flaged for fake POP (proof of Payment),  `ph_denied_fpop`= 0

                    */

                    $fetchQuery = "SELECT `tran_inv`, `tran_amt`, `user_id` FROM `pendingpair`WHERE `tran_amt` <= {$user_amt_due} && `user_id` != {$user_id_due} && `ph_conf`=1 && `tran_paired_status` = 0 && `ph_denied_fpop`=0 ORDER BY `id`";

                    $m = array(); // Match Memo items array
                    $picked_trans = array();
                    $numcalls = 0; // number of calls made to get Match        
                    $tran_inv = array();
                    $tran_amt = array();
                    $user_id = array();

                    //run query and throw users that fit the criteria into an array
                    if ($queryRun = mysqli_query($connect, $fetchQuery)) {

                         //check if data was pulled
                         if (mysqli_num_rows($queryRun) != NULL) {

                            //grab data from array and insert it into an array
                            while ($row = mysqli_fetch_assoc($queryRun)) {

                                //Populate Arrays to be used
                                $tran_amt[] = $row['tran_amt'];
                                $tran_inv[] = $row['tran_inv'];
                                $user_id[] = $row['user_id'];

                            }
                        }
                    }

                    ## Solve
                    list ($m4,$pickedItems) = knapSolveFast2($tran_amt, $tran_amt, sizeof($tran_amt) -1, $user_amt_due, $m);

                    # Display Result 
                    echo "<b><br><br>Invoice:</b><br>".join(", ",$tran_inv)."<br>";
                    echo "<b>Tran Amt:</b><br>".join(", ",$tran_amt)."<br>";
                    echo "<b>User_id:</b><br>".join(", ",$user_id)."<br>";
                    echo "<b>Max Value Found:</b><br>$m4 (in $numcalls calls)<br>";


                }
            }
            ?>

第一個while循環的結果是找到具有正確到期日期條件的用戶:

            Array
            (
                [user_id] => 9
                [due_payment] => 150
            )
            Array
            (
                [user_id] => 2
                [due_payment] => 150
            )

這意味着有2位用戶到期。 但嘗試循環這些用戶。 永遠不會找到第二個用戶的匹配...只有第一個用戶的匹配。

    Array
    (
        [user_id] => 9
        [due_payment] => 150
    )


    Invoice:
    1102, 9022, 9113, 9029, 9116
    Tran Amt:
    100, 50, 100, 50, 50
    User_id:
    2, 5, 8, 5, 7
    Max Value Found:
    150 (in 19 calls)

請幫助我找出我所缺少的。 Thaaaaank你:)

您的問題是您將變量稱為同一件事。

如果您看:

while ($row = mysqli_fetch_assoc($queryRun))  //External loop

在該循環中,您還有另一個

while ($row = mysqli_fetch_assoc($queryRun))   //Internal loop

因此,您在內部循環中使用的外部循環內部的變量實際上會覆蓋外部循環變量,因此,當需要第二次運行外部循環時,代碼認為它已經完成,因為它引用了內部循環變量

要解決此問題,必須重命名用於內部循環的變量

注釋SECOND_對於queryRun和該行都嘗試此操作:

if ($SECOND_queryRun = mysqli_query($connect, $fetchQuery)) {

                     //check if data was pulled
                     if (mysqli_num_rows($SECOND_queryRun) != NULL) {

                        //grab data from array and insert it into an array
                        while ($SECOND_row = mysqli_fetch_assoc($SECOND_queryRun)) {

                            //Populate Arrays to be used
                            $tran_amt[] = $SECOND_row['tran_amt'];
                            $tran_inv[] = $SECOND_row['tran_inv'];
                            $user_id[] = $SECOND_row['user_id'];

                        }
                    }
                }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM