2013-02-25 103 views
0

我想创建一个基于sql查询结果的计数器。 sql查询获取一堆数据,然后逐行计算持续天数,然后根据总天数计算当天有多少结果。 我一直试图弄清楚为什么我的计数器没有保留任何值。我知道SQL结果正在拉动数据。有任何想法吗?php - 虽然计数器不工作

这个想法是查看开始日期和当前日期之间的天数是否大于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++; 


          } 
      } 
+4

[**请不要在新代码中使用'mysql_ *'函数**](http://bit.ly/phpmsql)。他们不再被维护[并且被正式弃用](http://j.mp/XqV7Lp)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。 – Kermit 2013-02-25 16:46:21

+0

'$ calctoday'是完全不必要的 - 您将当前日期转换为格式化的字符串,然后将其直接转换回时间戳进行比较。你可以使用'time()'函数,并保存你的程序一大堆工作。或者更好的是,使用'DateTime'类和['DateTime :: diff()'](http://php.net/manual/en/datetime.diff.php)函数;它比'strtotime()'强大得多。 – SDC 2013-02-25 16:46:57

+0

这似乎也可以通过SQL查询本身轻松完成。 – 2013-02-25 16:58:52

回答

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

0

您有好几个问题,但继承人一个案例:

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

如果$数据是有史以来< 365执行将进入这个循环,永远不会退出,因为$的数据是不以任何方式操纵。同样的情况似乎发生在你的每一个循环中,除了第一个循环之外,它发生了“自行修复”,因为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,因为循环没有结束)。

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

+0

好吧,这是有道理的,我会重做日期转换,并尝试解释计算的需要。 – user1221768 2013-02-25 17:11:20