【问题标题】:Reassign loop variable inside for loop. Bug?在 for 循环中重新分配循环变量。漏洞?
【发布时间】:2013-09-13 20:15:10
【问题描述】:

我试图理解为什么这段代码会终止(是的,我测试过)-https://github.com/drkyro/mmcFE-litecoin/blob/master/cronjobs/cronjob.php

34: for($i = 0; $i < $numAccounts; $i++){
.
.
.
63:             $i=0;
.
.
.
129: }

这个简单的测试永远不会结束:

for($i = 0; $i < 10; $i++){
    echo "i1 = $i";
    $i=0;
}

有什么区别以及为什么在第一种情况下不重新分配循环变量?

【问题讨论】:

  • 也许$numAccounts 为零?
  • 第一个示例中的其余代码是什么。您至少有两个 if 语句可以阻止 $i=0。你确定 if 语句通过了吗?
  • 你有没有试过var_dump($numAccounts)看变量是否设置了不等于0?
  • 这就是问题所在:我刚刚尝试在 numAccounts = 5 上运行,它确实进入了这些 ifs 4 次。在 1,1,1,1 的情况下,最后 $i 的值。然后它停止了。

标签: php for-loop


【解决方案1】:

因为$i = 0 并不总是被执行。仅当帐户不存在时才执行。然后创建帐户,因此在下一次传递时$i 不会重置为0。您还需要代码周围的上下文。

仅此行为的简化视图:

for($i = 0; $i < $numAccounts; $i++) {
    $accountExistsQ = mysql_query("SELECT id FROM networkBlocks WHERE accountAddress = '".$transactions[$i]["txid"]."' ORDER BY blockNumber DESC LIMIT 0,1")or die(mysql_error());
    $accountExists = mysql_num_rows($accountExistsQ);

    if(!$accountExists) {
      mysql_query("INSERT INTO `networkBlocks` (`blockNumber`, `timestamp`, `accountAddress`, `confirms`, `difficulty`) ".
        "VALUES ('$assoc_block', '$assoc_timestamp', '" .$transactions[$i]["txid"]. "', '" .$transactions[$i]["confirmations"]. "', '$difficulty')");

      $i=0;
    }
  }
}

【讨论】:

  • 而且如果执行的话,也有可能递增到5
  • 我不明白 - 如果这个循环确实进入了那些 ifs,它会终止吗?它应该永远循环,不是吗? $numAccounts 在实际使用中的值为 240。
  • 没有。阅读代码。你没看到它如何只将$i 设置为 0如果帐户不存在然后插入一个新帐户?然后下次循环时,它不会输入if,因为该帐户现在存在
  • 现在我明白了。谢谢!
  • 愚蠢的我 - 我注释掉了所有插入语句以不修改数据库并检查代码的其他部分。这件事永远运行,它让我感到困惑。
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 2017-05-02
  • 2019-11-10
  • 2016-07-30
  • 2012-02-26
相关资源
最近更新 更多