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循环。

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

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

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

如果 $data 永远 < 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 > 365,则运行此代码。这段代码在做什么?将 $pernumc1 设置为 0,然后进入无限循环(已解决),然后设置 $pernum1 = $pernumc1(基本上为 0),最后将 $pernumc1 增加 1,因此它永远不会超过一个(或者,在在这种情况下,它将是 MAX_INTEGER,因为循环没有结束)。

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

于 2013-02-25T16:59:14.193 回答