PHP & MySQL : While Loop

标签 php mysql loops datetime while-loop

首先,我对 PHP 和 MySQL 还很陌生,所以我仍然会预先编写代码。

我正在开发一个应用程序,该应用程序接受交易并在特定的到期日向之前捐款的用户支付到期金额。我有一个function knapSolveFast2 这解决了背包问题(数据库中的一组交易金额加起来是到期日已到的用户的到期金额)。目前,我的演示数据库如下所示:

enter image description here

如果我当前的日期(现在)= 2017-04-03 11:36:03 = CAST(NOW() AS DATETIME) ,我的应用程序旨在遍历数据库,获取 maturity_date 的用户是>= 1 month来自 tran_date (即 WHERE maturity_date <= CAST(NOW() AS DATETIME) )。获取找到的每个用户并在 while 循环中将它们配对以支付给其他用户 tran_amttran_amt 的数据库中总结用户发现的成熟度 due_amount使用背包功能 knapSolveFast2 .

问题: 在第一个 while loop 找到到期日到期的用户(2 个用户)后, 我正在尝试运行一个内部 while 循环来将每个用户与其他用户配对 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

因此外部循环内的变量,您用于内部循环的变量实质上是覆盖外部循环变量,因此当第二次运行外部循环时,代码认为它已经完成,因为它指的是内部循环变量

要解决此问题,您必须重命名用于内部循环的变量

关于PHP & MySQL : While Loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43203601/

相关文章:

c++ - 大写字母

php - 显示表中列的总和

R 版本 3.0.3 的 MySQL 包

mysql - 接收同名属性时的外键引用

php - 如何根据同一辆公交车选择路线记录

PHP:生成没有零和一的有序 ​​ID

PHP & Twig : Trouble accessing variables in template

php - 如何在 drupal 7 中定义模块级变量

PHP 脚本打印 "error"

javascript - 如何制作动态函数?