而foreach循环导致空白页面

时间:2013-11-18 22:29:15

标签: php mysql sql arrays foreach

我真的想不通这个!

我正试图以下列方式显示数据库中的数据:

  • 循环通过12个值的数组($ jaren)的 FOREACH循环。 (用户可以选择其中一个值,在开头的表单中使用'select'输入,此处未显示)
  • WHILE循环在foreach循环中,其中应该循环遍历数据库中的每一行,其中第五列等于$ jaren数组的值' ''(foreach遍历这些值的eah)。

更加直观:

  

1e bach BMW:

     
    

表格中包含第5列等于'1e bach BMW'

的所有表格行   
     

2e bach BMW:

     
    

表格包含第5列等于'2e bach BMW'

的所有表格行   
     

等等......

罪魁祸首似乎是while循环的表达式($ row [5] = $ jaar),但我无法弄清楚它有什么问题。当我加载页面时,我得到一个完全空白的屏幕。

$results = $DB->q("SELECT * FROM `jaartrui_zoekertjes`");
$row = $DB->fa($results);
$jaren = array('1e bach BMW', '2e bach BMW', '3e bach BMW', '1e master BMW', '2e master BMW', '1e bach GNK', '2e bach GNK', '3e bach GNK', '1e master GNK', '2e master GNK', '3e master GNK', '4e master GNK');

foreach($jaren as $jaar) {
    echo "<b class='blauw'>".$jaar."</b>"
        ."<table><tr><th>Naam</th><th>E-mailadres</th><th>Ik heb</th><th>Ik wil</th></tr>";

        while ($row[5] = $jaar) {
            echo "<tr>"
                ."<td>".format_text($row[3])." ".format_text($row[2])."</td>"
                ."<td><a href='mailto:".format_text($row[4])."'>".format_text($row[4])."</td>"
                ."<td>".format_text($row[6])."</td>"
                ."<td>".format_text($row[7])."</td>"
                ."</tr><tr>"
                ."<td><b>Opmerkingen: </b>".format_text($row[8])."</td>"
                ."</tr>";
        }
    echo "</table>";    
}

任何?提前谢谢!

4 个答案:

答案 0 :(得分:2)

<强>更新

使用DBMS时,您可以(并且应该)使用查询进行比较,特别是如果您只想获取某些列。

foreach($jaren as $jaar) {
    //...
    $results = $DB->q("SELECT * FROM `jaartrui_zoekertjes` WHERE column = `$jaar`");
    while ($row = $DB->fa($results)) {
        //...
    }
}

(将column替换为列的名称)现在在while()中,您将只有想要的行,并且可以像想要的那样显示它们。这段时间=是正确的,因为您想要为$row分配检索到的值,所以当没有任何行时,fa()(全部获取?)应该返回false获取并打破时间。

当然,您可以像以前一样获取所有行。但是这种做法存在以下问题

  1. 您需要检查PHP是否column == $jaar,因此循环遍历所有行。在foreach的每次迭代中,这都非常耗时
  2. 假设您有没有匹配列的行(根本没有),您仍然会从数据库中检索这些行,并且必须检查所有这些行以匹配$ jaar,这会让我们回到1。
  3. 有人可能会争辩说,对数据的检查也会发生在您的数据库中(如何知道要返回哪些行?),但请记住,这些系统是专门为快速查询而设计的,在这种情况下。因此,在大多数情况下,让数据库尽可能多地完成工作会更好。


    原始回答

    $row[5] = $jaar分配$row[5]$jaar并且将等于true(除非$ jaar是假的)。你可能想写一些像

    这样的东西
    while ($row[5] == $jaar) {
    

    由于PHP仅在执行完成后输出,因此具有以下内容将使您获得空白页

    while (true)
        print "something";
    

    而不是屏幕上无穷无尽的“某事”

答案 1 :(得分:0)

(如另一个答案中所述:$row[5] = $jaar分配不是逻辑操作。

同样在

    while ($row[5] = $jaar) {
        echo "<tr>"
            ."<td>".format_text($row[3])." ".format_text($row[2])."</td>"
            ."<td><a href='mailto:".format_text($row[4])."'>".format_text($row[4])."</td>"
            ."<td>".format_text($row[6])."</td>"
            ."<td>".format_text($row[7])."</td>"
            ."</tr><tr>"
            ."<td><b>Opmerkingen: </b>".format_text($row[8])."</td>"
            ."</tr>";
    }

我看不到$ row [5]或$ jaar的变化。因此,您正在运行并且无限循环(在循环被击中的情况下)。这将导致没有任何内容传递给浏览器,并且只会在页面超时之前继续使用。

答案 2 :(得分:0)

我认为您的$row变量包含一组行。所以也许尝试循环它。现在看起来你试图比较整个第6行而不是行的第6行。

答案 3 :(得分:0)

我想你可能想要更像的东西:

$results = $DB->q("SELECT * FROM `jaartrui_zoekertjes`");
$jaren = array('1e bach BMW', '2e bach BMW', '3e bach BMW', '1e master BMW', '2e master BMW', '1e bach GNK', '2e bach GNK', '3e bach GNK', '1e master GNK', '2e master GNK', '3e master GNK', '4e master GNK');

foreach($jaren as $jaar) {
    echo "<b class='blauw'>".$jaar."</b>"
        ."<table><tr><th>Naam</th><th>E-mailadres</th><th>Ik heb</th><th>Ik wil</th></tr>";

        while ($row = $DB->fa($results)) {
            if ($row[5] != $jaar) {
              continue;
            }
            echo "<tr>"
                ."<td>".format_text($row[3])." ".format_text($row[2])."</td>"
                ."<td><a href='mailto:".format_text($row[4])."'>".format_text($row[4])."</td>"
                ."<td>".format_text($row[6])."</td>"
                ."<td>".format_text($row[7])."</td>"
                ."</tr><tr>"
                ."<td><b>Opmerkingen: </b>".format_text($row[8])."</td>"
                ."</tr>";
        }
    echo "</table>";    
}

在这种情况下,您将$jaren的每个值循环遍历整个数据库,将每行的第5列与$jaar进行比较。显然,这是一个效率极低的解决方案,您可能需要重新考虑自己的方法。也许循环遍历数据库一次,看看第5列是否匹配$jaren中的任何值,然后,如果匹配,则将结果填充到新的数组或对象中,然后按'$ jaar'值排序。