0

SQL クエリの結果に基づいてカウンターを作成しようとしています。SQLクエリは大量のデータを取得し、行ごとに日数を計算し、合計日数に基づいてその日に含まれる結果の数をカウントする必要があります. カウンターが値を保持していない理由を理解しようとしています。SQLの結果がデータを引き出していることは知っています。何か案は?

アイデアは、開始日と現在の日付の間の日数が 365 日を超えている場合はカウンターを開始し、365 日未満の場合は別のカウンターを開始することです。

$anymatches=mysql_num_rows($result_id);      
if ($anymatches > 0 )        
{
    while($row = mysql_fetch_array($result_id))
    {
        /*** Performing a calculation to get the number of days ***/
        $calctoday = date("Y-m-d"); // trying to capture current date

        $sd =  start_check_gap($row[1],45); // getting a date from the sql query
        $dateDiff = strtotime($calctoday) - strtotime($sd); // probably a better way to do this but calculating the difference between start date and current date.
        $totaldays = floor($dateDiff/(60*60*24));
        $data = $dateDiff / 86400;
        $data = number_format($data, 0, '.', '');
        if ($data > 365)
        {
            $pernumc1 = 0;
            while($data > 365)
            {
                $pernum1 = $pernumc1;
                $pernumc1++;
            }
        }
        elseif ($data < 365)
        {    
            $pernumc2 = 0;
            while($data < 365)
            {
                $pernum2 = $pernumc2;
                $pernumc2++;
            }

        }
        else
        {
            $pernumc3 = 0;
            while($data != FALSE)
            {
                $pernum3 = $pernumc3;
                $pernumc3++;
            }

        }

以下のコメントをありがとうございます。他の誰かが同じタイプの問題を抱えている場合に備えて、正しいバージョンを投稿したかった. 無限ループのコメントに基づいて、問題の原因を突き止めることができました。両方の問題です。最初の問題は、SQL クエリにエラーがあったことです。エラーを修正したら、皆さんが言及した無限ループの問題に気付きました。基本的に以下は私がやったことです。各 if() 内の while を削除し、開始カウンター変数 $pernumc1 を最初の while の上に移動したところ、魅力的に機能しました。まだ日付の比較をクリーンアップする必要があるように見えますが、全体的には機能します。

            $anymatches=mysql_num_rows($result_id);   
        if ($anymatches > 0 )       
        {
                                $pernumc1 = 0;
                                $pernumc2 = 0;
                                $pernumc3 = 0;
            while($row = mysql_fetch_array($result_id))
            {


                       $calctoday = date("Y-m-d");

                       $sd =  start_check_gap($row[1],45);
                       $dateDiff = strtotime($calctoday) - strtotime($sd);
                       $totaldays = floor($dateDiff/(60*60*24));
                        $data = $dateDiff / 86400;
                        $data = number_format($data, 0, '.', '');


                            if ($data > 548)
                            {
                                    $pernum1 = $pernumc1;
                                    $pernumc1++;

                            }
                            elseif ($data > 365)
                            {   
                                    $pernum2 = $pernumc2;
                                    $pernumc2++;

                            }
                            elseif ($data < 365)
                            {
                                    $pernum3 = $pernumc3;
                                    $pernumc3++;


                            }
            }
4

2 に答える 2

1

で何が起こり$sd = start_check_gap($row[1],45);ますか? すなわち の値は$sd何ですか?

の内容は何も変更されないため、最初のwhileループは決して終了しません$data

while($data > 365)
{
    $pernum1 = $pernumc1;
    $pernumc1++;
}

while同じことが 2 番目と 3 番目のループにも当てはまります。

while($data < 365)
{
    $pernum2 = $pernumc2;
    $pernumc2++;
}

// ...

while($data != FALSE)
{
    $pernum3 = $pernumc3;
    $pernumc3++;
}

あなたが見たいかもしれない別の奇妙な点は次のとおりです。

$calctoday = date("Y-m-d");
// ...
$dateDiff = strtotime($calctoday) - strtotime($sd);

これは次のように置き換えることができます:

$calcToday = time();
// ...
$dateDiff = strtotime($calctoday) - strtotime($sd);

さらに、$calcToday計算全体を通して同じように、whileループ構造の外に移動できます。

于 2013-02-25T16:55:18.227 に答える
0

かなりの問題がありますが、1つのケースを次に示します。

while($data < 365) {
    $pernum2 = $pernumc2;
    $pernumc2++;
}

$data が < 365 の場合、実行はこのループに入り、終了することはありません。これは、$data がまったく操作されないためです。mysql_fetch_array が最終的に false を返すため、最初のループを除いて、すべてのループ内で同じことが発生するようです。

別の小さな問題:

$calctoday = date("Y-m-d");

mysql の結果を通過するループ内でこれを行います。特に最小単位が 1 日であることを考慮すると、これはまったく不要です。これをループの外に移動して、mysql の結果行ごとに再計算されないようにします。

number_format($data, 0, '.', '');

PHP の number_format は数値を人間が読める文字列に変換しますが、文字列に変換した後で整数 (365) と比較する場合は、数値として保持しておき、どうしても必要な場合は後で変換した方がよいのではないでしょうか?

$pernumc1 = 0;
while($data > 365)
{
    $pernum1 = $pernumc1;
    $pernumc1++;
}

メイン ループ内で、$data > 365 の場合、このコードを実行します。このコードは何をしていますか? $pernumc1 を 0 に設定し、次に無限ループに入り (既にアドレス指定されています)、次に $pernum1 = $pernumc1 (基本的には 0) を設定し、最後に $pernumc1 を 1 ずつ増やします。この場合、ループが終了しないため、MAX_INTEGER になります)。

「制御構造」を読んで、いくつかのチュートリアルを見つけて、やろうとしていることを頭の中で正確に整理してから、プログラミングしてください。

于 2013-02-25T16:59:14.193 に答える