【问题标题】:Cannot get foreach to properly generate html table using PHP无法让 foreach 使用 PHP 正确生成 html 表
【发布时间】:2011-11-23 01:51:13
【问题描述】:

我有以下 2 个表:

         --  members --

      |member_ID|nick_name|
      ---------------------
      |    1    |   Jack  |
      ---------------------
      |    2    |   Jill  |
      ---------------------

           -- shares --

|member_ID|nick_name|percent_owner|
-----------------------------------
|   1     |  Jack   |     75      |
-----------------------------------
|   2     |  Jill   |     25      |
-----------------------------------

我的第一个 php 页面将查询成员表并创建一个 html 表就好了。在 html 表中,我添加了一个空白文本框来手动输入所有者百分比值。这张桌子是这样的:

<table>
  <?php foreach ($members as $members) : ?>
  <tr>
    <td><?php echo $members['member_ID']; ?></td>
    <td><?php echo $members['nick_name']; ?></td>
    <td><input type="text" name="percent_owner[]" value="" size="3"></td>
  </tr>
  <?php endforeach; ?>
</table>

现在,我要做的是将新信息发送到另一个页面,以创建另一个带有 member_ID、nick_name 和百分比所有者的 html 表。这就是我的问题所在。这是第二个 html 表:

<table>
  <?php foreach ($members as $member) : ?>
  <?php foreach ($_POST['percent_owner'] as $value) : ?>                
   <tr>
     <td><?php echo $member['member_ID']; ?></td>
     <td><?php echo $member['nick_name']; ?></td>
     <td><?php echo $value; ?></td>                 
   </tr>
  <?php endforeach; ?>
  <?php endforeach; ?>
</table>

我认为我没有正确组织我的 foreach 语句。要么我在每一行中只获得第一个 percent_owner 值,要么我在每一行中都获得了这两个值,但不能正确。一旦我弄清楚了这一点,我会将其全部输入到共享表中,但稍后会出现。我需要先解决这个问题。

谢谢!

【问题讨论】:

    标签: php mysql html forms foreach


    【解决方案1】:

    您需要为第一个代码块中的迭代变量使用不同的变量,而不是数组。

    foreach ($members as $member) 
    

    制作:

    <table>
      <?php foreach ($members as $member) : ?>
        <tr>
          <td><?php echo $member['member_ID']; ?></td>
          <td><?php echo $member['nick_name']; ?></td>
          <td><input type="text" name="percent_owner[]" value="" size="3"></td>
        </tr>
      <?php endforeach; ?>
    </table>
    

    更新:

    您正在尝试遍历每一行的两个 %,您想要的是该行中的 %。

    <table>
      <?php
       $i = 0;
       $percents = expload(',', $_POST['percent_owner']);
       foreach ($members as $member) : ?>                
       <tr>
         <td><?php echo $member['member_ID']; ?></td>
         <td><?php echo $member['nick_name']; ?></td>
         <td><?php echo $percents[$i++]; ?></td>                 
       </tr>
      <?php endforeach; ?>
    </table>
    

    您可能希望将第一个块中的输入名称更改为“percent_owner”。另外,请对这段代码持保留态度,因为它未经测试。

    【讨论】:

    • 但是下一页呢?是因为这个我在第二页的问题吗?就像我说的,第一张桌子似乎工作得很好。这是我遇到问题的第二张桌子。不过,我确实明白你的意思。我会解决的。
    【解决方案2】:

    您需要能够将输入的数据与其应用的行相匹配。一种方法是向每一行添加一个隐藏值,其成员 ID 与百分比所有者平行。从理论上讲,它们最终都会在各自的数组中具有相同的索引,您只需要匹配它即可。但这是一种丑陋且不可靠的方法。

    您可以处理此问题的另一种方法(绝对是两种方法中更好的方法)是在您在表中构建表单字段时将百分比所有者的用户输入字段的名称设置为 percent_owner_[member id]。然后,当您提交表单时,您可以遍历 POST 变量以查找“percent_owner_”的子字符串,当您识别这些输入时,您提取成员 ID 和用户输入的值并将其保存到索引数组中。然后您使用提取的 id 查询数据库以获取其他成员信息。

    示例表单域:

    <table>
      <?php foreach ($members as $members) : ?>
      <tr>
        <td><?php echo $members['member_ID']; ?></td>
        <td><?php echo $members['nick_name']; ?></td>
        <td><input type="text" name="percent_owner_<?=$members['member_ID']?>" value="" size="3"></td>
      </tr>
      <?php endforeach; ?>
    </table>
    

    然后在提交时你会像这样处理它:

    <?php
    foreach ($_POST AS $input => $value) {
      if (stristr($input, 'percent_owner_')) {
        $memberID = str_replace('percent_owner_', '', $input);
        $res = mysql_fetch_object(mysql_query("SELECT nick_name FROM members WHERE member_ID = '$memberID'"));
    
        $data[$memberID] = array(
          'memberID' => $memberID,
          'nickName' => $res->nick_name,
          'percentOwner' => $value
        );
      }
    }
    ?>
    
    <table>
      <?php foreach ($data as $member) : ?>
      <tr>
        <td><?php echo $member['memberID']; ?></td>
        <td><?php echo $member['nickName']; ?></td>
        <td><?php echo $member['percentOwner']; ?></td>
       </tr>
      <?php endforeach; ?>
    </table>
    

    【讨论】:

    • 首先,感谢您的帮助。当昵称已经从第一个表单发布时,为什么我必须执行 sql 查询来获取昵称? member_id、nick_name 和 percent_owner 不是已经在 $_POST 数组中了吗?
    • 不,一点也不。仅仅因为您将数据输出到 HTML 并不意味着它会将其发送回表单帖子。并非没有将数据放入表单输入中。否则它无法确定返回的数据是什么。
    • 如果您想要返回其他项目,您需要将它们的值编码到表单字段中。可能是隐藏的输入字段。但根本没有必要这样做,因为数据在您的数据库中。
    • 您是否使用过任何内容管理系统 (CMS)?查看 Wordpress 和 Drupal。两者都是免费的,可以帮助您学习很多东西(尤其是 Drupal)。
    • 但是按照我现在的方式,正在构建的表有 member_id、nick_name 和 percent_owner。我唯一的问题是 percent_owner 要么被复制,要么出现在多行上,等等。我觉得这只是我遇到的格式问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多