PHP-цикл while запросов mysql иногда возвращает пустой набор случайным образом (они не пусты, но результат пуст)

Я пишу отчет о данных, основанных на новых клиентах за каждый данный месяц, начиная с самого раннего месяца, когда заказ присутствовал вплоть до последнего месяца, когда присутствуют какие-либо заказы (я понимаю, что текущий код остановится в любой месяц, который новых клиентов не будет, и исправлю позже …)

Немного предыстории — я использую 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 фактического возвращенного массива, и он действительно пуст. (в случае, если вам интересно, что, возможно, count считает неправильно или кто знает … Я подумал, что это может быть исчисляемая проблема объекта / не-массива или причуды или что-то в этом роде)

Там может быть некоторая путаница в отношении повторных попыток и т. Д., Поскольку это не имеет никакого отношения к моему желаемому результату и были только попытками решить проблему, вот оригинальный код:

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

0

Решение

извините, это, вероятно, не совсем ответ, но слишком большой для комментариев.

  1. Я не уверен, что эта ошибка в PHP или слабость с подключением БД
    Можете ли вы изменить ваш повтор, чтобы распечатать запрос и запустить его в вашем клиенте MySQL вручную?

может быть, у вас есть странные входы?

  1. попробуйте добавить нулевую проверку к этому

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

я подозреваю, что у вас сначала установлена ​​БД в NULL, и они всплывают в верхней части вашего заказа

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]