while 循环内循环?将数据与 PHP 分离


while loop inside a while loop? Separating data from PHP

while($row = mysql_fetch_array($result))
//Template for each card in search result
{
echo '<div class="sleeve">';
echo '<div class="card ', $row['name'], '">';
    echo '<div class="front face">';
        echo '<img src="/', $row['cardset'], '/', $row['name'], $row['altart'], '.jpg"', ' alt="', $row['name'], '" />';
    echo '</div>';
    echo '<div class="back face">';
        echo '<a id="name">', $row['name'], '</a><br/>';
        echo '<form name="info" action="">';
        echo '<select name="set">';
            //while???
            echo '<option value="Zendikar">', $row['sets'],'</option>';
        echo '</select>';
        echo 'Foil:<input type="checkbox" name="foil" value="true"/><br/>';
        echo '<select name="condition">';
            echo '<option value="Near Mint">Mint</option>';
            echo '<option value="Played">Played</option>';
            echo '<option value="Damaged">Damaged</option>';
        echo '</select>';
        echo 'Trade:<input type="checkbox" name="trade" value="true"/ <br/>';
        echo '</form>';
        echo '<b>Rulings:</b> <br/>';
        echo $row['rulings'];
    echo '</div>';
echo '</div>';
echo '</div>';
}

//而???在混乱的回声中可能很难看到,但有一个部分我不知道如何处理。 PHP 正在抓取信息行,并很好地填充它们。 它用小信息框填充屏幕。

在本节中,我不知道如何处理,其中一行中的数据每次都包含多个内容(thing1,thing2,thing3(,由(,(分隔。 我需要在新事物中的每一种东西

1

所以我觉得每张卡里面会有一个 while 循环吗?

你走在正确的轨道上。尝试这样的事情,它根据逗号分隔符将字符串分解成一个数组,explode()

echo '<select name="set">';
foreach( explode( ',', $row['sets']) as $item)
    echo '<option>', $item, '</option>';
echo '</select>';
在将

字符串分解为数组后,您可能需要一个 foreach 语句:而不是//while 行和以下行:

foreach (explode(',', $row['sets']) as $value)
  echo '<option value="', $value, '">', $value,'</option>';

我想你实际上可能每行都有另一个值(一个要显示,另一个是你想要设置的实际值(,但是字符串看起来更像"(key1=value1,key2=value2(",然后你需要更多的工作,但你明白了。希望这有帮助。

是的,您需要首先将该行explode到数组中

$list_of_things = explode(",", $row['whatever']);

然后使用whileforeach

$thing_options = '';
foreach($list_of_things as $thing)
    $thing_options .= "<option>$thing</option>";

您可能还会发现此处的文档语法很有用:

print <<<TEMPLATE
<div class="sleeve">
    <div class="card {$row['name']}">
    <div class="front face">
        <img src="/{$row['cardset']}/{$row['name']}{$row['altart']}.jpg"
           alt="{$row['name']}" />
    </div>
    <div class="back face">
        <a id="name">{$row['name']}</a>
        <br/>
        <form name="info" action="">
        <select name="set">
            {$thing_options}
            <option value="Zendikar">{$row['sets']}</option>
        </select>
        ...
TEMPLATE;

虽然所有告诉您explode()数组的答案都是正确的,但我不禁认为,用逗号分隔值填充数据库列是数据库未规范化的症状。 您应该查看以下链接以获取数据库规范化的介绍:http://mikehillyer.com/articles/an-introduction-to-database-normalization/

我还建议不要回显 HTML。 理想情况下,您的 PHP 脚本应遵循以下模式:

预先处理所有 PHP,包括数据库查询和表单处理。 结果应存储在变量中。

|
|
|

几乎是纯HTML模板/视图,具有足够的显示逻辑(if/else,循环,echo(来实际显示您在步骤1中存储在变量中的结果。

你会发现,如果你让PHP成为大脑,让HTML成为美女,调试/编辑就会简单得多。 就像标记和样式应该分开一样,脚本和显示也是如此。

您可以使用 PHP 的 explode -方法将逗号分隔的字符串拆分为其值,然后在 foreach 循环中处理该数组:

$raw = "one,two,three";
$values = explode("," $raw);
foreach($values as $value) {
    echo $value;
}