我正在根据每个给定月份的新客户编写一份关于数据的报告,从最早的月份开始,一直到存在任何订单的最后一个月(我意识到当前代码将在不存在的任何月份停止) '没有新客户,稍后会修复......)
一些背景——我正在使用 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));
}