1

このコードを実行しようとすると、無限ループに陥るように見えます。しかし、私はこの問題の原因を理解できません。たぶん、物事に余分な目が問題を指摘することができるでしょうか?

この問題は、異なる年のゾーンがある場合にのみ発生します。例:2012-2018

例:$ this->budget_model-> set_monthly_budget( '1'、 '2012'、 '8'、 '2014'、 '1');

    function set_monthly_budget($start_month, $start_year, $end_month, $end_year, $budget_group_id)
{

    $user_id = 2;

    // Current date
    $current_month = $start_month;
    $current_year = $start_year;
    $days_in_current_month = cal_days_in_month(CAL_GREGORIAN, $current_month, $current_year);
    $company_id = 1;
    $month_goal = 100;

    // Check if it is the current month
    if($start_year == $end_year)
    {

        for($x=$current_month;$x<=$end_month;$x++)
        {

            $data = array(
                'user_id' => $user_id,
                'budget_group_id' => $budget_group_id,
                'month' => $x,
                'year' => $start_year,
                'company_id' => $company_id,
                'month_goal' => $month_goal
            );

            // Inserting information into the database
            $this->db->insert('budget_month',$data);

        }

        return true; // Return true if the task was completed

    }

    if($start_year !== $end_year)
    {

        $temp_start_year = $start_year;

        while($temp_start_year !== $end_year)
        {

            // Check if we are in the same year as we started
            if($temp_start_year == $current_year)
            {

                // Insert remaining months for this year
                for($x=$current_month;$x<=12;$x++)
                {

                    $data = array(
                        'user_id' => $user_id,
                        'budget_group_id' => $budget_group_id,
                        'month' => $x,
                        'year' => $temp_start_year,
                        'company_id' => $company_id,
                        'month_goal' => $month_goal
                    );

                    // Inserting information into the database
                    $this->db->insert('budget_month',$data);

                }

            }

            // Check if the temp and end year is the same
            if($temp_start_year < $end_year)
            {

                // Insert remaining months for this year
                for($x=1;$x<=12;$x++)
                {

                    $data = array(
                        'user_id' => $user_id,
                        'budget_group_id' => $budget_group_id,
                        'month' => $x,
                        'year' => $temp_start_year,
                        'company_id' => $company_id,
                        'month_goal' => $month_goal
                    );

                    // Inserting information into the database
                    $this->db->insert('budget_month',$data);

                }

            }

            // Check if we are in the same year as we started

            if($temp_start_year == $end_year)
            {

                // Insert remaining months for this year
                for($x=1;$x<=$end_month;$x++)
                {

                    $data = array(
                        'user_id' => $user_id,
                        'budget_group_id' => $budget_group_id,
                        'month' => $x,
                        'year' => $temp_start_year,
                        'company_id' => $company_id,
                        'month_goal' => $month_goal
                    );

                    // Inserting information into the database
                    $this->db->insert('budget_month',$data);

                }

            }

            $temp_start_year++;

        }

    }

}
4

1 に答える 1

6

あなたのコードで

while($temp_start_year !== $end_year)

!==を使用しました。これは、2つの変数の型が同じかどうかもチェックします。

しかし、この行

$temp_start_year++;

変数を暗黙的に整数にキャストします。

したがって、!==は整数と文字列を比較し、常にtrueと評価されます。

解決策は、!==の代わりに!=を使用するか、関数を呼び出すときに文字列の代わりに整数をフィードする(一重引用符を削除する)のと同じくらい簡単です。

于 2012-11-28T07:25:55.433 に答える