【问题标题】:While loop only executing onceWhile循环只执行一次
【发布时间】:2012-03-16 20:04:20
【问题描述】:

我有一个表单,可以在文本框中显示联系人电子邮件地址,并下拉选择相应电子邮件的标题。

TitleSelect1 电子邮件1 TitleSelect2 Email2 ....

电子邮件有一个 title_id 集,选择列表选择现有的标题。这适用于第一个联系人,但其余的只会显示电子邮件地址,标题下拉列表为空。

<?php

while ($row2 = mysql_fetch_array($Contact_list)) {
    ?>
<tr>
    <td align="right"><select id="Contacts_title" name="Contacts_title[]">
        <?

        while ($row3 = mysql_fetch_array($title_list)) { //put the contact titles into an array

            if ($row3['title_id'] == $row2['title_id']) {
                ?>
                <option value="<? echo $row3['title_id'] ?>" selected="true"><? echo $row3['title'] ?>!</option>';
                <?
            }

            else {
                ?>
                <option value="<? echo $row3['title_id'] ?>"><? echo $row3['title'] ?> </option>';
                <?
            }
        }

        ?>
    </select>
    </td>
    <td align="left"><input type="text" id="Contacts" name="Contacts[]" value="<? echo $row2['email'] ?>"/></td>
</tr>
<?
    $count++;
} 

【问题讨论】:

  • 我通常评论人们缺乏缩进。你先生设法做相反的事情。
  • 缺少&lt;?php some_statement: ?&gt; ... &lt;?php endsome_statement; ?&gt; 会让小飞碟哭泣。
  • 该代码乍一看似乎没问题.. 检查您的 $title_list 查询并确保您没有限制 1 或其他阻碍您查询的东西。尝试直接从 mysql 执行该查询,看看它是否返回所有结果。

标签: php mysql html


【解决方案1】:

mysql_fetch_array() 只检查给定查询的结果一次。由于您不是每次都通过联系人列表循环执行 title_list 查询,因此当您在第一次迭代之后开始每次迭代时,它仍然位于查询结果的末尾。

您需要做的是从您的 title_list 查询中获取所有结果,将它们放入一个数组中,然后为您的每个联系人迭代 那个


以下是一个一般示例,说明您将如何执行此操作(去掉多余的部分):

$contact_list = //some query
$title_list = //some query

$titles = array();
while($title_ar = mysql_fetch_array($title_list)) {
  $titles[] = $title_ar;
}

while($contact_ar = mysql_fetch_array($contact_list)) {
    // some stuff
    foreach($titles as $title) {
        // do something with each title
    }
}

【讨论】:

  • foreach 循环是最好的方法吗?
  • foreach 循环是遍历数组的一种简单方法,是的。
  • 好的,所以使用 foreach 将 title_list 放入一个数组,然后在 Contact_list 的 While 循环中使用它以获得正确的输出?
  • 否 - 使用while 循环将title_list 拉入一个数组,然后在while 循环内使用foreach 循环为contact_list 获得正确的输出。请参阅我编辑的示例。
【解决方案2】:

您应该将行放在一个变量中,并在 while 循环之后回显。

【讨论】:

    【解决方案3】:

    一旦内部 while 循环完全执行一次,您将不会在 mysql_fetch_array 再次调用中获得更多值。由于光标到达了行尾。

    你应该将内部 while 循环的结果存储到一个 php 数组中,然后每次在内部 while 循环中迭代这个数组。

    【讨论】:

    • 更好的是,他应该使用 PDO 并结束那些愚蠢的功能。
    • 是的,但显然 OP 只是从 php 和 mysql 的细微差别开始
    • 没错。与其学习 mysql,不如学习正确的方法(如果不是 PDO,而不是至少 MySQLi)。