0

私は、注文があった最初の月から注文があった最後の月まで、特定の月ごとの新規顧客に基づくデータに関するレポートを書いています (現在のコードは、注文がない月には停止します)新しい顧客がいないため、後で修正します...)

いくつかの背景 - 私は Flourish Framework (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));
}

いくつかの追加事項..明らかな理由で電子メールアドレスを検閲し、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