【问题标题】:PHP 'While' within a ForEach loop pulling from SQL DataBase从 SQL 数据库中提取的 ForEach 循环中的 PHP 'While'
【发布时间】:2020-09-01 15:39:39
【问题描述】:

根据我的 SQL 数据库中的条目数,我有一个小表被多次复制,假设是关于颜色的。这些表格将随着每个新条目向右移动一个位置。在其中,我现在希望在每个条目中能够自动输出几个字段。例如,单个表条目可能是“reds”,现在我想显示不同的红色阴影,即“shade1”、“shade2”、“shade3”、“shade4”,然后下一个条目可能是'黄色',我希望它显示添加的黄色,即'shade1','shade2'。我的代码是这样的:

<?php
    error_reporting(E_ALL ^ E_NOTICE);
        $stmt = $conn->prepare("SELECT * FROM colours");
        $stmt->execute();
        $colours = $stmt->fetchALL();

    if($colours){
    $i = 1;

        foreach ($colours as $key => $colour) {
            $coloursrow1 .='<table >
                <tr><th>' . "<b>{$colour['colour']}</b>" . '</th></tr>
                <tr><td>' . "<img src='{$colour['shade1']}' />" . '</td></tr>
                <tr><td>' . "<img src='{$colour['shade2']}' />" . '</td></tr>
                <tr><td>' . "<img src='{$colour['shade3']}' />" . '</td></tr>
                <tr><td>' . "<img src='{$colour['shade4']}' />" . '</td></tr>
            </table>';
            $i++;
        }   
    }
?>  

我想知道是否可以代替&lt;tr&gt;&lt;td&gt;' . "&lt;img src='../colours/reds/shade1.jpg' /&gt;" . '&lt;/td&gt;&lt;/tr&gt; 之类的所有行,而可以写一些类似

if($colours){
$i = 1; $x = 1;

    foreach ($colours as $key => $colour) {
        $coloursrow1 .='<table >
            <tr><th>' . "<b>{$colour['colour']}</b>" . '</th></tr>';
    }
        while ($x < 6) {
            '<tr><td>' . "<img src='{$colour['shade$x']}' />" . '</td></tr>';
            $x++;
        }
    foreach ($colours as $key => $colour) {
        '</table>';
        $i++;
    }   
}

这样它就可以自动抓取并输出它们,还让我能够限制可以输出的数量。

我尝试了不同的方法来实现这一点,但我总是陷入死胡同。我一定是做错了什么(?)

【问题讨论】:

  • $colour 仅在foreach() 的范围内,因此将while() 括起来将不会像您预期的那样起作用。
  • 我现在知道这有多大意义,但是当我尝试将 while () 包含到 foreach ($colours as colour) {} 中时,它会处理 30 秒,然后超时并出现错误。我也不明白其中的问题。
  • 可能是因为$i++ 被丢弃并且它是一个无限循环(最多执行 30 秒)。
  • 啊!这向我解释了一些事情,因为我以前发生过这种情况。在这种情况下,我将如何设置上限?把整个东西放在另一个while ($i &lt; 8) {}

标签: php sql if-statement foreach while-loop


【解决方案1】:

似乎是这样的,因为PDO::fetchAll() 返回一个空数组或错误时返回 false。因此,只需直接迭代该集合即可。还有,数组访问错误,应该是{$colour['shade'.$x]}

<?php

error_reporting(E_ALL ^ E_NOTICE);

$stmt = $conn->prepare("SELECT * FROM colours");
$stmt->execute();
$colours = $stmt->fetchALL();

foreach ($colours as $colour) {
    $coloursrow1 .= "<table><tr><th><b>{$colour['colour']}</b></th></tr>";

    $x = 1;

    while ($x < 6) {
        $coloursrow1 .= "<tr><td><img src='{$colour['shade'.$x]}' /></td></tr>";
        $x++;
    }

    $coloursrow1 .= '</table>';
}

【讨论】:

  • 太棒了!完美修复。除了我最初的错误之外,我现在可以看到我完全没有意识到我需要在每行新添加的代码中输入$coloursrow1 .= "。非常感谢你和我一起经历这一切,贾里德。
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 2017-05-28
  • 2019-02-18
  • 1970-01-01
  • 2018-05-20
  • 2014-11-13
  • 2014-10-19
  • 1970-01-01
相关资源
最近更新 更多