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

PHP while mysql查询循环有时会随机返回一个空集(它们不是空的,但结果是空的),php,mysql,flourishlib,Php,Mysql,Flourishlib,我正在写一份关于每个月新客户数据的报告,从订单出现的最早月份一直到订单出现的最后一个月,我意识到当前代码将在没有新客户的任何月份停止,并将在以后修复 一些背景-我正在使用Flower框架www.flourishlib.com。。第一个月/年设置正确,因为我记录了错误。有订单的第一个月是2013年4月 问题在于,出于某种原因,MySQL在完全随机的某个点随机返回一个空结果。我在MySQL客户机中运行了该月/年的查询,它返回了一个空结果,而不是一个空结果。脚本本身证明了这一点,因为它返回的空结果是随

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

一些背景-我正在使用Flower框架www.flourishlib.com。。第一个月/年设置正确,因为我记录了错误。有订单的第一个月是2013年4月

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

我试着在两个查询之间睡觉,因为我最初认为这可能是节流或什么的,不可能。还是一样的行为。我尝试过使用重试,当它遇到计数为0时,它将重试最多X次,每次它为空时,这意味着它不能是其中之一,有时它会退出,请重试类型的场景

以下是目前的代码:

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

抱歉,这可能不是一个真正的答案,但对于评论来说太大了

我不确定这个错误是在PHP中还是在db连接中出现的 您可以修改您的重试以打印查询并手动在mysql客户端中运行它吗? 也许你有奇怪的输入

尝试将空检查添加到此

    SELECT completed
    FROM orders
    WHERE client_id = clients.id
    AND completed IS NOT NULL
    ORDER BY completed ASC
    LIMIT 1

我怀疑您先将db设置为空,然后它们会浮动到订单的顶部

$currentMonth>=12?这意味着您将跳过十二月,只允许一月->十一月。它应该是>12或>13。这不是Javascript。PHP和MySQL中的月份是1->12,而不是0->11Hm。我不确定这是否是一个问题?现在检查代码,但既然您提出了这一点,到运行代码时,它已经到了12月,就像在上一个循环的末尾,它从11到12。。我说的不对吗?12月,不是11月。。我更正了它,但只是为了通知的目的,他们确实这样做了,这就是为什么我有having子句的第一部分是first_order不是null having子句不保证没有有效的完成,因为它只是检查第一部分,这要感谢order BY/LIMIT。例如:NULL,1,2,3限制1,只检查NULL和completed不为NULL是正确的方法吗?我补充说,在WHERE行之后,它仍然有相同的问题。我想知道是不是因为我把它限制在一个范围内,如果这是问题所在?我打印出了查询并运行了最后一个手动复制/粘贴没有返回结果的查询,它返回了一堆东西。我想知道是否有什么奇怪的事情发生了,因为我把它放在打印查询中,如果计数是0,它没有打印任何东西。在运行查询之前,我只需打印所有这些内容。她会死吗?
    SELECT completed
    FROM orders
    WHERE client_id = clients.id
    AND completed IS NOT NULL
    ORDER BY completed ASC
    LIMIT 1