【问题标题】:php+mysqli while(false !== ($data = $mysqli_res->fetch_assoc)) creates infinite loopphp+mysqli while(false !== ($data = $mysqli_res->fetch_assoc)) 创建无限循环
【发布时间】:2023-03-26 20:05:02
【问题描述】:

我在管理面板中为新的 cmets 编写了概述。我的代码

if($res = $db->query("select * from comments where unlocked=0"));
{
    $o = 0; //abortcondition temp
    echo '<div class="newcomments"><a>neuste kommentare: </a><br />';
    //here is the infinite loop
    while(false !== ($data = $res->fetch_assoc()) && ++$o < 10)
    {
        if($articles = $db->query("select title from coreless_articles where ID=".$data['article']))
        {
            if(false !== ($article = $articles->fetch_assoc()))
            {
                echo 
                '<div id="comment'.$data['ID'].'">'.$data['from'].' in'.
                ' <a href="article/'.($article['uri']).'#comments">'.$article['title'].'</a>'.
                ' <a href="javascript:;">anzeigen</a>'.
                ' <a href="javascript:;">freischalten</a>'.
                ' <a href="javascript:;">l&ouml;schen</a>'.
                ' <div class="preview" >'.$data['text'].'</div>'.
                '</div>';
            }
        }
    }
}

如果我没有 $o 中止条件,则创建一个无限循环。但我想展示所有新的 cmets,而不仅仅是 ++$o

有什么想法吗?

【问题讨论】:

  • 如果将 false 替换为 NULL(或 !== 替换为 !=)会发生什么?
  • 此外,您的代码看起来容易受到 SQL 和 XSS 注入的攻击。这可能是您想要解决的问题。

标签: php mysql while-loop infinite-loop


【解决方案1】:

mysqli_result::fetch_assoc 为空时返回 NULL,而不是 FALSE。 http://www.php.net/manual/en/mysqli-result.fetch-assoc.php

返回对应于获取的行的关联数组或 如果没有更多行,则为 NULL。

只需将您的测试更改为NULL !== (etc)

(这很令人困惑,因为等效函数 mysql_fetch_assoc() 确实返回 FALSE。)

【讨论】:

    【解决方案2】:

    为什么要测试否定条件?你为什么不简单地测试一下阳性呢?

    while($data = $res->fetch_assoc())
    {
     //.....
    }
    

    无论如何,@evan 对代码创建无限循环的解释绝对正确。

    【讨论】:

    • 这是一个值得鼓励的坏习惯。虽然在 this 情况下可能无关紧要,但想象一下循环遍历 $res-&gt;fetch_assoc() 可能是空数组的数据集;或者,如果您正在循环使用 0 或其中的空字符串的数组。
    • NULLfalse 将打破循环。对于空数据集或空数组,循环中的代码将永远不会执行。简单地说,当第一次检查条件时,它将评估为false 并且永远不会进入循环。我看不出有什么危险。
    • 你误解了我的意思——如果你循环遍历的数据集 in 中的一个数组是空的怎么办。 PHP 将空数组解释为 falsy。您的循环将在该点停止。如果您在循环列表中的某些 元素 可以是 0"" 或其他虚假值,则相同。 技术上没有错在这种情况下-我同意它不会发生在这种情况下-但这是一个坏习惯。
    • 抱歉,我不同意这是一个坏习惯。我以这种方式构造条件,因为我知道我正在迭代来自 DB 的结果,并且行永远不能是空字符串或空数组。根据您的建议,我必须检查我正在使用的函数的返回类型,我们可以看到这可能会导致问题:)
    猜你喜欢
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2010-11-07
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多