【问题标题】:Results Repeat When Using Nested while Loops in PHP在 PHP 中使用嵌套的 while 循环时结果重复
【发布时间】:2015-12-29 07:14:15
【问题描述】:

我正在使用 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;
}

【问题讨论】:

  • “问题是结果在每个数组中重复。” 我认为不应该这样做?你能澄清一下这个问题吗?也许会产生预期的输出以及它现在如何显示? (请不要发布示例墙,而是缩短版本)
  • 如果你在描述中看到我已经发布了一个链接,它将带你到生成的输出..

标签: php json nested-loops


【解决方案1】:

这可能真的对您没有帮助,但我可能会更改您的代码以使用 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'] */ 
    } 
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在您尝试接受我的建议后,我看到您将自己的帖子标记为答案。没什么大不了的,但是没有人会接受您的代码的建议。我不是想冒犯你,但不必要的嵌套查询是一个很大的禁忌。使用 PHP 来嵌套连接查询而不是使用 MySQL 来完成它与依赖 JavaScript 来完成应该使用 PHP 完成的工作是一样的。请学习使用 JOIN(如果您还没有)。开发时,生活将变得容易 100000000000 倍。我保证。
    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多