0

我正在根据每个给定月份的新客户编写一份关于数据的报告,从最早的月份开始,一直到存在任何订单的最后一个月(我意识到当前代码将在不存在的任何月份停止) '没有新客户,稍后会修复......)

一些背景——我正在使用 Flourish Framework (www.flourishlib.com)。第一个月/第一年设置正确,因为我有错误记录。订单的第一个月是 4/2013。

问题在于,由于某种原因,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));
}

再加上一些额外的事情..出于明显的原因,我审查了电子邮件地址,并且确实查看了 MySQL 客户端中实际返回的数据,这是正确的,并且我还对返回的实际数组进行了 vardump,它确实是空的。(如果您想知道计数可能计数不正确或谁知道......我想这可能是一个可数对象/非数组问题或怪癖或其他东西)

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

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

1 回答 1

0

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

  1. 我不确定这个错误是在 PHP 中还是在 db 连接中出现问题你可以修改你的重试以打印出查询并在你的 mysql 客户端中手动运行它吗?

也许你有奇怪的输入?

  1. 尝试为此添加一个空检查

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

我怀疑您首先将您的数据库设置为 NULL,然后它们会浮动到您订购的顶部

于 2015-01-07T21:38:33.150 回答