php - 虽然计数器不工作

时间:2013-02-25 16:41:47

标签: php

我正在尝试根据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移动到第一个以上,而它就像一个魅力。看起来我仍然需要清理日期比较,但整体上它是有效的。

            $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++;


                            }
            }

2 个答案:

答案 0 :(得分:1)

$sd = start_check_gap($row[1],45);会发生什么?即$sd的价值是什么?

第一个while循环永远不会退出,因为没有任何内容会修改$data的竞争。

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

同样适用于第二个和第三个while循环。

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循环结构之外。

答案 1 :(得分:0)

你有很多问题,但有一个案例:

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

如果$ data始终&lt; 365执行将进入此循环并永不退出,因为$ data不会以任何方式被操纵。在你的每一个循环中都会发生同样的情况,除了第一个循环,碰巧“自我修复”,因为mysql_fetch_array最终返回false。

另一个小问题:

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

你在通过mysql结果的循环中执行此操作,这是完全没必要的,特别是考虑到你的最低单位是一天,将它移到循环之外,这样它就不会在每个mysql结果行上重新计算。

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

PHP number_format将一个数字转换为一个人类可读的字符串,但是在将它转换为一个字符串后,你将它与一个整数(365)进行比较,将它保存为数字不是更好,如果绝对将其转换必要?

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

在主循环内部,如果$ data&gt; 365,你运行这段代码。这段代码在做什么?它将$ pernumc1设置为0,然后进入无限循环(已经解决),然后设置$ pernum1 = $ pernumc1(基本上为0),最后将$ pernumc1增加1,所以它永远不会超过一个(或者,在这种情况下,它将是MAX_INTEGER,因为循环没有结束)。

阅读“控制结构”,找到一些教程,并在脑海中准确地组织你要做的事情,然后编程。