【问题标题】:Populating a table in PHP在 PHP 中填充表
【发布时间】:2013-09-16 18:06:59
【问题描述】:

我的数据库中有一个这样的表:

IdUser | Name | Surname | 

还有一个结构如下的表

IdPN | IdUser | PhoneNumber

这个表的PK是IdPN,所以每个用户可以有多个电话号码。

现在我从第一个表中获取数据,用于在我的 HTML 页面中填充一个表。我想要这样的东西:

name | Surname| numbers  |
_____|________|__________|
John | Doe    | 21212121 |
     |        | 23424324 |
_____|________|__________|
Frank|Johnson | 23222111 |
     |        | 23747347 |
     |        | 36363636 |
_____|________|__________|

所以第三列可以有多个数字。

当我为每个用户只有一个号码时,我使用的代码 php 如下:

<?php
      $connectiondb->set_charset("utf8");
      $query= "SELECT name, surname, phonenumber
      FROM users";
        if ($stmt = $connectiondb->prepare($query)) {
          $stmt->execute();

      $stmt-bind_result($nome,$cognome,$phonenumber);
            while($stmt->fetch()){
      echo '<tr>';
      echo '<td>'.$nome.'</td>';
      echo '<td>'.$cognome.'</td>';
      echo '<td>'.$phonenumber.'</td>';
      echo '</tr>';

}
$stmt->close();
?>

如何更改代码以显示表(用户)的每一行的多个数字?

【问题讨论】:

  • "SELECT name, surname, phonenumber FROM users" 怎么可能跑?我虽然 phonenumber 来自与其他 2 个不同的表?
  • 您需要为每个带有自己的 idPN 的电话号码设置一行,否则您将在使用该表时受到伤害。另外我建议添加一个“类型”列来区分工作与家庭等
  • @Jordan 我说的是我的旧代码,当时每个用户的 phoenumber 只是一个,所以不需要第二个表。

标签: php html mysql sql mysqli


【解决方案1】:

您需要在输出到前端之前准备好您的记录集。

<?php
$connectiondb->set_charset("utf8");
$query= "SELECT users.IdUser, users.Name, users.Surname, phones.PhoneNumber
         FROM users
         LEFT JOIN phones ON (users.IdUser = phones.IdUser);";
if ($stmt = $connectiondb->prepare($query)) {
    $stmt->execute();

    $stmt->bind_result($id, $nome, $cognome, $phonenumber);

    /*
      Recordset will be 
      |1|Jim|Bowen|07235876583
      |1|Jim|Bowen|07734952651
      |2|Jim|Davidson|07275493085
      |2|Jim|Davidson|07197649387
      |2|Jim|Davidson|07030190594       

     */
    $result = array();
    while($stmt->fetch())
    {
        if(!isset($result[$id]))
        {
            // save any previous person in $result
            if(is_array($temp)) $result[$id] = $temp; 

            // start a fresh person
            $temp = array();

            // first time to come accross this person
            $temp['id'] = $id;
            $temp['name'] = $nome;
            $temp['surname'] = $cognome;
            $temp['phonenumbers'] = array($phonenumber);
        }
        else
        {
            // if we've already come across this person, only store his/her next phonenumber in the array
            $temp['phonenumbers'][] = $phonenumber
        }
    }

    /* the $result array will now look thus
    array (size=2)
      0 => 
        array (size=4)
          0 => string '1' (length=1)
          1 => string 'Jim' (length=3)
          2 => string 'Bowen' (length=5)
          3 => 
            array (size=2)
              0 => string '07235876583' (length=11)
              1 => string '07734952651' (length=11)
      1 => 
        array (size=4)
          0 => string '2' (length=1)
          1 => string 'Jim' (length=3)
          2 => string 'Davidson' (length=8)
          3 => 
            array (size=3)
              0 => string '07275493085' (length=11)
              1 => string '07197649387' (length=11)
              2 => string '07030190594' (length=11)
    */
$stmt->close();
}

您现在可以像这样回显:

foreach($result as $row)
    echo '<tr><td>'.$row['name'].'</td><td>'.$row['surname'].'</td><td>'.implode(', ', $row['phonenumber'].'</td></tr>';

【讨论】:

  • 谢谢@Mei。但是,你确定 if(is_array($temp)) 有意义吗?
  • 我刚刚稍微修改了你的代码,现在它可以工作了。你的想法很好。 :)
【解决方案2】:
$sql = "SELECT PhoneNumber FROM PhoneNumbers WHERE IdUser = $user_id";
$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result)) {
    echo $row['PhoneNumber'] . "<br />\n";
}

该代码块可用于显示$user_id 的电话号码列表,以换行符分隔。只要定义了$user_id,放在电话号码区域的&lt;td&gt; 标记内就可以了。

【讨论】:

【解决方案3】:

如果你有两张桌子;

IdUser | Name | Surname  
IdPN | IdUser | PhoneNumber

我会使用第一个表作为“主”表,将第二个表作为辅助表。 IdUser 将成为您主表中的 PK,但您的辅助表中的 IdUser 将是主表中 IdUser 的外键(因为这两条信息是相同的,您真的不应该将对象添加到电话号码主表中没有相应条目的表。)您应该能够对两个表执行查询以显示您需要的信息(例如,可能是完全连接)。举个例子;

select a.IdUser, a.Name, b.Surname, b.IdPN, b.PhoneNumber from <primary table> as a, <secondary table> as b where a.IdUser=b.IdUser;

这是一个例子,所以不要复制粘贴进去,但重点是如果两个表之间的关系是一致的,你应该可以执行一次查询得到你需要的一切。

【讨论】:

    【解决方案4】:

    我建议使用ID 而不是Name

    你的数据会像这样返回:

    name | Surname| numbers  |
    _____|________|__________|
    John | Doe    | 21212121 |
    John | Doe    | 23424324 |
    John | Doe    | ######## |
    -------------------------- 
    

    编辑:重新阅读问题,注意到您的表格结构

    查询会变成:

                SELECT name, surname, phonenumber, phone_ct
    
                FROM   users as u 
    
                       join phone_numbers as ph
                          on ph.IdUser = u.IdUser 
    
                       join phone_numbers as ph
                          on ph.IdUser = u.IdUser 
    
                       join (select IdUser, 
                                    count(IdPN) as phone_ct 
                             from phone_numbers
                             group by IdUser ) as ph_count   
                          on ph_count.IdUser = u.IdUser 
    

    现在数据会变成:

    name | Surname| numbers  | phone_ct
    _____|________|__________|___________
    John | Doe    | 21212121 |        3 |
    John | Doe    | 23424324 |        3 | 
    John | Doe    | ######## |        3 | 
    -------------------------------------
    

    编辑:更新的代码可能真的可以工作(大声笑......对不起)

    代码会变成:

    <?php
          $connectiondb->set_charset("utf8");
          $query = "
                SELECT name, surname, phonenumber, phone_ct
    
                FROM   users as u 
    
                       join phone_numbers as ph
                          on ph.IdUser = u.IdUser 
    
                       join phone_numbers as ph
                          on ph.IdUser = u.IdUser 
    
                       join (select IdUser, 
                                    count(IdPN) as phone_ct 
                             from phone_numbers
                             group by IdUser ) as ph_count   
                          on ph_count.IdUser = u.IdUser ";
    
          if ($stmt = $connectiondb->prepare($query)) 
          {
             $stmt->execute();  
             $stmt->bind_result($nome, $cognome, $phonenumber, $phone_ct);
    
             $row_ct = 0; 
    
             while($stmt->fetch())
             { 
                $row_ct++ 
    
                // do every row for every section
                echo '<tr>';
    
                // first row of this section 
                if ($row_ct==1)                    
                { 
                   echo "<td rowspan=$phone_ct>".$nome.'</td>';
                   echo "<td rowspan=$phone_ct>".$cognome.'</td>';
                }
    
                // do every row for every section
                echo '<td>'.$phonenumber.'</td>';    
                echo '</tr>';
    
                // end of this section 
                if ($row_ct==$phone_ct) {           
                  $row_ct = 0; 
                }   
            }
    
            $stmt->close();
    
         }  // end if $stmt 
    

    ?>

    【讨论】:

      【解决方案5】:

      更改您的 SQL 以包含 IdUser 列,如下所示:

      SELECT users.IdUser, users.Name, users.Surname, phones.PhoneNumber
      FROM users
      LEFT JOIN phones ON (users.IdUser = phones.IdUser);
      

      然后您可以使用 PHP 将电话排序为结构化数组并从那里开始:

      $aUsers = array();
      $aUserPhones = array();
      
      while ($row = mysql_fetch_assoc($result)) {
          if (!isset($aUsers)) {
              $aUsers['UserId'] = array(
                  'nom'       =>  $nom,
                  'cognom'    =>  $cognome,
                  'phones'    =>  array($phone),
              );
          }
          else {
              $aUsers[$userId]['phones'][] = $phone;
          }
      
      }
      
      foreach ($aUsers as $aUser) {
          echo '<tr>';
          echo '<td>'.$aUser['nome'].'</td>'
          echo '<td>'.$aUser['cognome'].'</td>';
          echo '<td>';
          echo implode('<br>', $aUser['phones']);
          echo '</td>';
          echo '</tr>';
      }
      

      【讨论】:

      • 这个我需要在 users 表和 phonenumber 表之间有一个左外连接,对吧?
      • 您的问题并不清楚您是否也需要 SQL 帮助。假设电话号码是可选的,我已经更新了我的答案以包括 LEFT JOIN
      • 在这种情况下,考虑到我的问题中的示例,我将有一个 5 行的表,但我想要一个 2 行的表(每个用户一个)
      【解决方案6】:

      像这样执行查询

      SELECT A.name, A.surname,GROUP_CONCAT(phonenumbers) as phone_number
      FROM TABLE1 A 
      JOIN TABLE2 B ON A.iduser = B.iduser
      GROUP BY A.iduser
      

      从这个查询中你会得到电话号码逗号分隔

      示例:(1123132132,123123133)

      使用explode拆分

      $get_number = explode(" ", $number);
      

      现在您将获得数组$get_number 中的数字。通过

      获取数字的计数
      $row_span = count($get_number); 
      

      现在您将拥有行跨度。使用 foreach 您可以打印表格中的数字。 所以你的 td 会像

      <td rowspan="<?php echo $row_span; ?"> 
      

      我希望这会对你有所帮助。如果需要任何帮助,请告诉我

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-25
        • 2017-07-20
        • 1970-01-01
        • 2023-04-10
        • 2015-02-27
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        相关资源
        最近更新 更多