在 PHP 中使用嵌套 while 循环时结果重复

Results Repeat When Using Nested while Loops in PHP

我正在使用 PHP 开发 API,其结果为 JSON。问题是结果在每个数组中重复。如果您检查 Here.

,您将更好地理解我要说的内容

这是我的代码:

<?php

function requiredData()
{
    $db = $this->dbConnection();
    //$sql = "SELECT * FROM projects JOIN project_details ON projects.project_id=project_details.project_id";
    $sql = "SELECT * FROM projects LIMIT 10";
    //$sql = "SELECT * FROM projects,project_details WHERE projects.project_id=project_details .project_id";

    $queryResult = $db->query($sql);

    if ($queryResult->num_rows > 0)
    {
        while ($row = $queryResult->fetch_assoc())
        {
            $pid = $row['project_id'];
            $detailsql = "SELECT * FROM project_details WHERE project_id=$pid LIMIT 10";
            $sqlResult = $db->query($detailsql);
            if ($sqlResult->num_rows > 0)
            {
                while ($d = $sqlResult->fetch_assoc())
                {
                    $r[] = array(
                        "project_id" => $d['project_id'],
                        "project_detail" => array(
                            "work_done" => $d['project_detail'],
                            "payment_status" => $d['project_payment_status'],
                            "detail_id" => $d['project_detail_id']
                        )
                    );
                }
            }

            $results[$row['project_name']] = array(
                "project_id" => $row["project_id"],
                "project_start_date" => $row["project_start_date"],
                "project_due_date" => $row["project_due_date"],
                "project_currency" => $row["project_currency"],
                "project_work_details" => $r
            );
        }
    }

    return $results;
}

这可能真的 对您没有帮助,但我可能会更改您的代码以使用 JOIN 而不是嵌套查询。

显然,您应该根据要返回的数据、方式和时间选择 RIGHT、LEFT、INNER 或 OUTER 联接。但是在不了解你的项目的情况下......这就是我会做的。将递归、关联和繁重的工作留给数据库引擎。这就是它的工作。

 $sql = "SELECT * FROM projects p INNER JOIN project_details d ON p.ID=d.project_id WHERE p.ID={$pid}"; 
    $res = mysql_query($sql); 
    if ($res) { 
    while ($row = mysql_fetch_array($res)) {
     /* Handle row processing using $row['column'] */ 
    } 
}

我对代码做了一些调整并开始工作...这是我的代码...如果有人遇到同样的问题,他们可以将我的代码作为参考。

function requiredData() {

    $db = $this->dbConnection();
    //$sql = "SELECT * FROM projects JOIN project_details ON projects.project_id=project_details.project_id";
    $sql = "SELECT * FROM projects LIMIT 10";
    //$sql = "SELECT * FROM projects,project_details WHERE projects.project_id=project_details .project_id";

    $queryResult = $db->query($sql);

    if ($queryResult->num_rows > 0) {

        $results = array();


        while ($row = $queryResult->fetch_assoc()) {

            $pid = $row['project_id'];
            //$detailsql = "SELECT * FROM projects p INNER JOIN project_details d ON p.project_id=d.project_id WHERE p.project_id={$pid} LIMIT 10";


            $detailsql = "SELECT * FROM project_details WHERE project_id = $pid";
            $sqlResult = $db->query($detailsql);


            $results[$pid] = array(
                "project_name" => $row['project_name'],
                "project_id" => $row["project_id"],
                "project_start_date" => $row["project_start_date"],
                "project_due_date" => $row["project_due_date"],
                "project_currency" => $row["project_currency"],
                "project_details" => array()
            );


            if ($sqlResult->num_rows > 0) {
                while ($d = $sqlResult->fetch_assoc()) {
                        $results[$pid]['project_details'][] = array(
                               "project_detail" => array(
                                "detail_id" => $d['project_detail_id'],
                                "work_done" => $d['project_detail'],
                                "work_payment" => $d['project_payment'],
                                "payment_status" => $d['project_payment_status']
                            )
                        );

                }
            }
        }
    }
    return $results;
}