【问题标题】:Skip foreach loop when response is empty using PDO querys in php使用 php 中的 PDO 查询在响应为空时跳过 foreach 循环
【发布时间】:2020-08-13 10:57:29
【问题描述】:

我需要访问一个数据库,以便将从查询中获得的信息存储为一个数组,并推送从外部来源获得的更多数据,以最终使用 API 存储更新后的数组。我的查询的核心在于每个客户的 id,这是以前从 API 获得的,使用 id 我启动查询以查看数据库中是否有信息,但并非每个客户都有数据存储在数据库中,因为遗憾的是,我直接在生产中工作,我害怕测试如果我因为害怕搞砸而试图推空$newData 会发生什么(这就是为什么我没有在测试代码中使用array_push()将在下面发布,但var_dump($newData)。在这种情况下,我尝试了几种方法来跳过循环,我目前正在使用另一个var_dump($msg) 来测试,但我无法设置正确的条件,所以消息永远不会出现。

这是我的查询和更新上述数组的代码:

$stmt = $conn->prepare('SELECT a.`zone`, b.`source_customer_billing_zone_id`, b.`source_external_subscriber_id`, SUM((CEIL(b.`duration`))/60) AS minutos, SUM((b.`source_customer_cost`)/100) AS total 
                                FROM `billing`.billing_zones a INNER JOIN cdr b 
                                ON a.`id` = b.`source_customer_billing_zone_id` 
                                WHERE source_external_subscriber_id = :source_external_subscriber_id
                                GROUP BY b.`source_external_subscriber_id`, a.`zone` 
                                ORDER BY  total desc');
        $stmt->execute(array('source_external_subscriber_id' => $source_external_subscriber_id));


        foreach ($stmt as $row) {

            $newData = [
                'name' => $row['zone'],
                'sku' => $row['source_customer_billing_zone_id'],
                'units' => $row['minutos'],
                'subtotal' => $row['total'],
                'tax' => 21,
                'account' => $account
            ];

            array_push($invoice['products'], $newData);
}

$invoice 是我从 API 创建的数组,我必须将数据库信息附加到该数组。每当$source_external_subscriber_id 在数据库中有条目时,它都可以正常工作,但如果 id 不存在,我不知道如何跳过该 id 的循环。

此时我已经尝试了几件事,但似乎都没有工作,因为 $msg 从未显示:

/* 1 */
foreach ($stmt as $row) {
    if (!empty($row) && $row != "") {

        $newData = [
            'name' => $row['zone'],
            'sku' => $row['source_customer_billing_zone_id'],
            'units' => $row['minutos'],
            'subtotal' => $row['total'],
            'tax' => 21
        ];

        var_dump($newData);

    }else{

        $msg = "There are no entries";
        var_dump($msg);
    }

}



/* 2 */
if (!empty($stmt)) {

    foreach ($stmt as $row) {


        $newData = [
            'name' => $row['zone'],
            'sku' => $row['source_customer_billing_zone_id'],
            'units' => $row['minutos'],
            'subtotal' => $row['total'],
            'tax' => 21
        ];

        var_dump($newData);
    }
}else{
    $msg = "There are no entries";
    var_dump($msg);
}



/* 3 */
if (!is_array($stmt)) {

    $msg = "There are no entries";
    var_dump($msg); 

}else{
    foreach ($stmt as $row) {
        $newData = [
            'name' => $row['zone'],
            'sku' => $row['source_customer_billing_zone_id'],
            'units' => $row['minutos'],
            'subtotal' => $row['total'],
            'tax' => 21
        ];

        var_dump($newData);
    }
}

-更新-

尝试我想到的第三个解决方案时,它总是显示$msg,因为它不是真正的数组:当我转储变量时,查询就是出现的内容。我不知道如何做到这一点。 谢谢大家的帮助!

【问题讨论】:

  • 我不想和你吵架,我相信你也不想听我的工作或经历的细节,我的公司使用第三方应用程序来存储发票( API 我必须使用)所以我无法创建测试环境,因为唯一的环境是每年花费 50K 的环境,这是我负担不起的价格。无论如何,谢谢你的帮助。
  • 不,抱歉,如果我没有正确解释自己,是否有第三方应用程序的 API 可以在另一个第三方应用程序的帮助下处理所有发票。我的代码必须使用 API ($invoice) 获取发票,使用客户端 ID 在数据库中搜索其他产品/服务,如果有,将它们添加到发票 (array_push()) 以最后使用API。但并不是每个客户都有这些额外的产品/服务,因此$newData 有时会出现空缺的问题。目标是从等式中删除第二个第 3 方应用程序。
  • 一个假想问题的明显案例。 Foreach 已经在响应为空时跳过循环,您现有的代码已经按预期工作。投票结束
  • 我明白了,我之前提到过,我没有测试环境,而且我来这里不久就已经搞砸了计费,所以我害怕重复错误和除非 100% 确定,否则不想尝试任何事情。我忘了谢谢你的帮助!
  • @YourCommonSense “我已经尝试了几件事,我不想在生产中进一步试验,至少不知道我正在接近解决方案”。在对可能的解决方案有更好的想法之前尝试了很多事情并且不想尝试更多是完全可以的。如果您不想帮助该人,要求澄清细节或出于标准原因之一关闭问题,请继续下一个问题。如果 foreach 循环没有任何可迭代的内容,那么想要做特定的事情是完全有效的。

标签: php mysql pdo foreach


【解决方案1】:

您可以使用PDOStatementrowCount 在迭代之前找出是否有任何命中:

if ($stmt->rowCount()) {
    foreach (...) {

    }
else
{
    print("Display error message here");
}

另一种选择是不直接遍历语句,而是先获取行,然后决定做什么:

$rows = $stmt->fetchAll();

if ($rows)
{
    foreach ($rows as $row)
    {
        ..
    }
}
else
{
    // display error message
}

【讨论】:

  • 非常感谢马茨!这是我第一次使用 PDO,作为我公司唯一的开发人员,我只工作了 5 个月。我会立即对其进行测试,并为您提供最新进展!
猜你喜欢
  • 1970-01-01
  • 2016-06-29
  • 2015-07-23
  • 2017-02-12
  • 1970-01-01
  • 2014-05-14
  • 2015-03-14
  • 2015-10-29
  • 2012-08-14
相关资源
最近更新 更多