【问题标题】:Nesting do while loops in PHP在 PHP 中嵌套 do while 循环
【发布时间】:2013-05-11 23:02:36
【问题描述】:

我试图获取 DB 中每个客户的每月总销售额,我使用了以下代码:

SELECT *, SUM(total_amount)
FROM orders
WHERE YEAR(order_date) = YEAR(NOW()) AND client = clientname
GROUP BY MONTH(datetime)

clientname 是一个保存客户端数组的变量。

这里是sql查询执行(我使用dreamweaver):

mysql_select_db($database, $server);

$query_clients = "SELECT client_name 
    FROM clients
    ORDER BY client_name ASC";
$clients = mysql_query($query_clients, $server)
    or die(mysql_error());
$row_clients = mysql_fetch_assoc($clients);
$totalRows_clients = mysql_num_rows($clients);

$clientname_MonthlySalesClient = "-1";

if (isset($row_clients['client_name'])) {
  $clientname_MonthlySalesClient = $row_clients['client_name'];
}

mysql_select_db($database_server, $server);

$query_MonthlySalesClient =
    sprintf("SELECT *, SUM(total_amount)
        FROM orders
        WHERE YEAR(order_date) = YEAR(NOW())
        AND client = %s
        GROUP BY MONTH(order_date)",
    GetSQLValueString($clientname_MonthlySalesClient, "text"));

$MonthlySalesClient = mysql_query($query_MonthlySalesClient, $server) or die(mysql_error());
$row_MonthlySalesClient = mysql_fetch_assoc($MonthlySalesClient);

$totalRows_MonthlySalesClient = mysql_num_rows($MonthlySalesClient);

然后我在 PHP 中使用了以下代码:

<?php do { ?>
<tr>
    <td>
    <?php echo $row_clients['client_name']; ?>
    </td>
    <?php do { ?>
        <td>
        <?php
        echo number_format($row_MonthlySalesClient['SUM(total_amount)']);
        ?>
        </td>
    <?php
    } while ($row_MonthlySalesClient = mysql_fetch_assoc($MonthlySalesClient));
    ?>
</tr>
<?php }
while ($row_clients = mysql_fetch_assoc($clients));
?>

我正确地获得了第一个客户的月销售额,但对于后续客户,它显示零结果。我不知道我缺少哪个代码才能让它工作!

【问题讨论】:

  • 能否请您显示生成$row_clients 值的代码?
  • 向我们展示您构建结果的方式....$clients 和 $MonthlySalesClient

标签: php mysql sql loops nested


【解决方案1】:

您发布的代码不起作用。来自the docs

do-while 循环与 while 循环非常相似,除了在每次迭代结束而不是开始。

换句话说,$row_MonthlySalesClient = mysql_fetch_assoc($MonthlySalesClient) 尚未在内部 do-while 循环的第一次迭代中运行。

另外,我看不到您实际执行 SQL 查询的位置。您的代码还有更多内容吗?

尝试更改为 while 循环,然后检测集合是否为空以显示“空结果”消息。从代码的角度来看,不能保证查询的结果集中一定会有任何行,使用 do-while 就意味着这一点。

编辑:我认为您的问题是您只执行一次客户端名称查询,而不是每行一次。至少在您展示的循环中,$MonthlySalesClient 结果只会包含第一个客户端名称的结果。

尝试使用$MonthlySalesClient 移动您正在执行的所有操作,包括$query_ 格式、mysql_query() 和外部循环内的`mysql_fetch_assoc() 调用。这应该会为您尝试构建的客户信息的每一行提供新的月度数据。

【讨论】:

  • 其实我忘记粘贴查询了,这里是:
  • 由于您在查询后立即执行 sql 提取,因此 do-while 循环将起作用。大多数人仍然会写while($row = fetch($result) { //stuff },因为你仍然不能保证有任何结果。我想我看到了您实际询问的问题,用另一个代码更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多