【问题标题】:PHP: While loop conditionPHP:while循环条件
【发布时间】:2011-10-12 10:24:14
【问题描述】:
$result= db_query("SELECT dayoff FROM specificdayoff");
$node->frmdate = mktime(0,0,0, $node->frmdate['month'], $node->frmdate['day'],$node->frmdate['year']);
$node->todate = mktime(0,0,0, $node->todate['month'], $node->todate['day'],$node->todate['year']);
$node->dayoff = mktime(0,0,0, $node->dayoff['month'], $node->dayoff['day'],$node->dayoff['year']);
$data = $node->dayoff;
$frmdate = $node->frmdate;
$todate = $node->todate;    

$iii=0;
while($frmdate!=$todate)
{
    while($data= db_fetch_object($result))
    {
        if($frmdate==$data)
        {
            $iii++;
           //debug
        }

    }
    $frmdate=mktime(0, 0, 0, date("m", $frmdate), date("d", $frmdate)+1, date("Y", $frmdate));
    //debug2     
   }
$diff=$iii

我需要将$frmdate 的每个元素与$data 的所有元素进行比较。但是当我运行这段代码时,$diff 一直返回 0。意思是说,我的 if 语句有问题,但我似乎无法弄清楚它有什么问题。

当我调试这段代码时,两个 while 循环都没有按我的意愿运行。第二个while循环只运行一次。每次第一个 while 循环运行时,我都需要运行第二个 while 循环。有什么帮助吗?

调试运行如下: 调试 调试 调试 调试2 调试2 调试2

我需要它像这样运行: 调试 调试 调试 调试2 调试 调试 调试 调试2 调试 调试 调试 调试2

【问题讨论】:

  • 看起来您正在将一个对象 ($data) 与一个整数 (时间戳 $frmdate) 进行比较。我会检查您对db_fetch_object 的期望
  • @BrendanLong 因为当 $frmdate 不等于 $data 时,我不希望对 $iii 进行任何添加
  • @Cooper - 所以请留下else。你不需要一个。 if 语句单独使用就可以了。
  • @phindmarsh 你知道我可以比较这两个变量($data,$frmdate)的方法吗?我希望 db_fetch_object 会获取数据库中的“dayoff”字段。 “dayoff”字段包含时间戳。我需要将这个休息日字段与 $frmdate 进行比较。

标签: php while-loop


【解决方案1】:

我感觉你的specificdayoff 表中有一个时间戳。如果是这种情况,那么您的 db_fetch_object 方法将检索具有 dayoff 属性的对象。

要访问它,您可以使用$data->dayoff。所以你需要把if($frmdate==$data)的条件改成if($frmdata == $data->dayoff)

这只是猜测,不知道您的 db_fetch_object 将返回什么。也就是说,我仍然没有完全理解这里应该发生的事情,这可能只是您遇到的几个问题之一。

【讨论】:

  • 天哪!这行得通!你就是那个人。 $data->dayoff 可以将 $data 更改为整数!我的 if 语句现在正在运行。谢谢你的帮助。
  • @Cooper,没问题,我很高兴它有帮助。如上所述,如果此解决方案或其他解决方案(@Brendan 提供)解决了您的问题,请将其标记为已接受。
  • 两个答案都解决了我的问题。所以我应该将两者都标记为已接受。正确的?对不起。这里是新手。
【解决方案2】:

$frmdate 是一个简单的 PHP 时间戳记,由 mktime() 创建。然后,将此时间戳值与由数据库获取语句创建的 OBJECT 进行比较。时间戳和数据库提取对象永远不会相等,因此您的 while 循环的 $iii++ 永远不会被触发。

【讨论】:

  • 难怪我总是得到 0。我找到了将 fetch_object 转换为时间戳的方法,以便可以将其与 $frmdate 进行比较!谢谢老兄!
【解决方案3】:

你说的问题是这样的:

while($data= db_fetch_object($result))

发生的情况是,在运行此循环一次后,您将获取所有结果,因此没有任何结果。再次遍历循环,仍然没有结果,因为您已经全部获取了它们。您需要重新设置$result。您没有包含此代码,而是查找类似于 $result = ... 的行。

类似这样的:

$node->frmdate = mktime(0,0,0, $node->frmdate['month'], $node->frmdate['day'],$node->frmdate['year']);
$node->todate = mktime(0,0,0, $node->todate['month'], $node->todate['day'],$node->todate['year']);
$node->dayoff = mktime(0,0,0, $node->dayoff['month'], $node->dayoff['day'],$node->dayoff['year']);
$data = $node->dayoff;
$frmdate = $node->frmdate;
$todate = $node->todate;    

$iii=0;
while($frmdate!=$todate)
{
    $result= db_query("SELECT dayoff FROM specificdayoff");
    while($data= db_fetch_object($result))
    {
        if($frmdate==$data)
        {
            $iii++;
        }
    }
    $frmdate=mktime(0, 0, 0, date("m", $frmdate), date("d", $frmdate)+1, date("Y", $frmdate));  
}
$diff=$iii

【讨论】:

  • 那么,每次第一个循环运行时,我有什么功能或方法可以让第二个循环运行吗?我已经在代码块中添加了变量声明、查询和调试结果。
  • @Cooper - 在外循环内设置$result
  • 哦。完毕!对不起。我还是新的。再次感谢布兰登的帮助。
猜你喜欢
  • 2015-11-08
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2012-07-24
  • 2015-08-19
  • 2015-05-23
  • 2020-11-12
  • 2020-01-23
相关资源
最近更新 更多