首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql查询的PHP while循环有时会随机返回一个空集(它们不是空的,但结果是空的)

mysql查询的PHP while循环有时会随机返回一个空集(它们不是空的,但结果是空的)
EN

Stack Overflow用户
提问于 2015-01-08 05:15:18
回答 1查看 570关注 0票数 0

我正在写一份基于每个给定月份的新客户的数据报告,从出现订单的最早月份一直到出现订单的最后一个月(我意识到当前代码将在任何没有新客户的月份停止,并将在以后修复...)

一些背景知识--我使用的是Flourish框架(www.flourishlib.com)。第一个月/年的设置是正确的,因为我把它记出来时出错了。收到订单的第一个月是2013年4月。

问题是,由于某些原因,MySQL在某个时刻随机返回一个完全随机的空结果。我已经在MySQL客户端中运行了该月/年的查询,它返回了一个空结果,但它不是一个空结果。脚本本身证明了这一点,因为它返回的空结果是随机的,并且它将比以前更进一步,有时会显示正确的信息。

我试着在查询之间打瞌睡,因为我最初认为它可能是节流或其他什么,不能进行。还是一模一样的行为。我试过使用重试(当它遇到计数为0的时候,它会重试X次),每次它都是空的,这意味着它不可能是那种“有时会失败,再试一次”类型的场景。

下面是现在的代码:

代码语言:javascript
复制
function newClients($month, $year) {
    $db = fORMDatabase::retrieve();

    $noobs = $db->query("
        SELECT
        id,
        email,
        (
            SELECT completed
            FROM orders
            WHERE client_id = clients.id
            ORDER BY completed ASC
            LIMIT 1
        ) as first_order
        FROM clients
        HAVING first_order IS NOT NULL
        AND MONTH(first_order) = '$month'
        AND YEAR(first_order) = '$year'
        AND email NOT LIKE '*@********.com'
        AND email NOT LIKE '%@********.com'
        AND email NOT LIKE '%@********.com'
        AND email NOT LIKE '%@********.com'
        AND email NOT LIKE '%@********.com'
        AND email NOT LIKE '%@********.org'
        AND email != '********@gmail.com'
        AND email != '********@********.net'
    ")->fetchAllRows();
    return $noobs;
}

$currentMonth = $theFirst['month'];
$currentYear = $theFirst['year'];

$retries = 0;
$noobs = newClients($currentMonth, $currentYear);
while (count($noobs) > 0 || $retries < 3) {
    if (count($noobs) == 0) {
        error_log('retry #' . ($retries + 1) . '...');
        $retries++;
        $noobs = newClients($currentMonth, $currentYear);
        error_log('count: ' . count($noobs));
        sleep(5);
        continue;
    }
    error_log("loop $currentMonth / $currentYear: " . count($noobs));
    if ($currentMonth >= 12) {
        $currentYear++;
        $currentMonth = 1;
    } else {
        $currentMonth++;
    }
    sleep(1);
    $noobs = newClients($currentMonth, $currentYear);
    error_log('count: ' . count($noobs));
}

几件额外的事情..出于显而易见的原因,我审查了电子邮件地址,并且我确实查看了MySQL客户端中的实际返回数据,这是正确的,我还对实际返回的数组进行了vardump,它确实是空的。(如果您想知道计数是否有误,或者谁知道呢..我认为这可能是一个可数对象/非数组问题或怪癖或其他原因)

可能会有一些关于重试等的混淆,因为这与我想要的结果无关,只是试图解决问题,以下是原始代码:

代码语言:javascript
复制
$noobs = newClients($currentMonth, $currentYear);
while (count($noobs) > 0) {
    error_log("loop $currentMonth / $currentYear: " . count($noobs));
    if ($currentMonth >= 12) {
        $currentYear++;
        $currentMonth = 1;
    } else {
        $currentMonth++;
    }
    $noobs = newClients($currentMonth, $currentYear);
    error_log('count: ' . count($noobs));
}
EN

回答 1

Stack Overflow用户

发布于 2015-01-08 05:38:33

对不起,这可能不是一个真正的答案,但太大的评论。

  1. 我不确定这个错误是在PHP中还是与数据库连接有关的问题。你能修改你的重试来打印出查询并在你的mysql客户端中手动运行吗?

也许你有奇怪的输入?

  1. 尝试将null校验添加到此

从client_id = clients.id且completed IS NOT NULL ORDER BY completed ASC LIMIT 1的订单中选择completed

我怀疑您的db首先设置为NULL,然后它们会浮动到您的排序的顶部。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27828791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档