使用while循环在同一表格行

时间:2017-08-03 23:35:28

标签: php mysql

我想我需要在while循环中使用while循环,但是当我这样做时,我会收到奇怪的结果。

我有以下PHP:

$sql = "SELECT c.id, c.title, c.image, u.profileImage, u.fname, u.lname, u.level AS ulevel, u.city, u.state, u.hs, u.ps, uc.id, uc.cid 
        FROM c, u, uc 
        WHERE uc.cid = c.id AND uc.userid = u.id 
        ORDER BY usercollege.createdate ASC";


        if ($result = mysqli_query($conn, $sql)) {
            while ($row = mysqli_fetch_assoc($result)) {


            if ($row['status'] == null) {
                 echo "";
            }

            if ($row['ulevel'] == "A Profile") {
                 echo '<tr>' .
                     '<td class="small">' . '<a href="http://www.example.com/aprofile.php?user="'.$row["username"] . '>' . '<img src="'.$row['profileImage'].'" />' . '</a>' . '</td>' .
                     '<td class="large">' . $row['fname']. ", " . $row['lname'] . '</td>' .
                     '<td class="large">' . $row['city'] . ", " . $row['state'] . '</td>' .
                     '<td class="large">' . $row['hs'] . '</td>' .
                     '<td class="largest">' .
                          '<div class="Limage">' . '<img src="images/c/'.$row['image'].'"/>' . '</div>' . 
                     '</td>' .
                  '</tr>';
$row['image']内的{p> <div class="Limage">目前只返回一张图片,但每个用户ID最多可包含10张图片。显然,这个循环(如果每个用户有多个图像)将为具有不同图像的用户创建一个新行。

我试图让所有图像(最多10个)出现在同一行的同一行中,而不会在表格中复制相同的用户。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

如果每行包含相同的数据,除了头像,您需要在查询中连接行:


SELECT c.id, c.title, GROUP_CONCAT(c.image SEPARATOR ','), u.profileImage, u.fname, u.lname, u.level AS ulevel, u.city, u.state, u.hs, u.ps, uc.id, uc.cid 
        FROM c, u, uc 
        WHERE uc.cid = c.id AND uc.userid = u.id
        GROUP BY c.id
        ORDER BY MAX(usercollege.createdate) ASC

然后您的结果(图像字段)包含以下内容:

avatar1.png,avatar2.png,avatar3.png,avatar4.png

现在你可以爆炸sql-result并在foreach循环中显示。

答案 1 :(得分:0)

虽然您的问题有点难以理解,但我可以告诉您需要做什么,这不是循环内的循环(即使它是)。因为我不在乎决定你的架构,但我认为我理解你的问题,我会用psudo代码概述它

首先,您需要整理数据

if ($result = mysqli_query($conn, $sql)) {

     $users = []; //initialize variable to store data in. 

     while ($row = mysqli_fetch_assoc($result)) {
          if( !isset( $users['u'.$row['id']]){
                $users['u'.$row['uid']] = $row; //group users by id 
           }
           $users['u'.$row['uid']]['images'][] = $row['image'];
     }
      //*note you'll have to probably add  u.id as uid to you select.

     foreach( $users as $user ){
     //... code/html for displaying user (open).
        foreach( $user['images'] as $img){
        //... code/html for displaying image.
        }//end foreach image
    //... code/html for displaying user (close).
    }//end foreach user

当您使用$users等输出时,var_export()数组的结果是这样的。

    [ 
       [ 'u10' => [
             'id' => 10,
             'images' => [
                  '{src for image1}',
                  '{src for image2}',
             ]

       ]

当您使用联接提取记录时,您可以反映用户对图像的一对多关系。因此,每个图像行都有相同的用户行。您需要做的就是按用户ID对它们进行分组,这将使您的代码更容易下载。除非你处理1000个用户,否则它对时间的影响可能很小,并且非常值得简化HTML结构。它们在sql中返回的顺序可能会导致各种问题,您可以从用户1开始,其他用户10,然后以用户1结束,这样他们就可以很好地分组在第一个循环中。为了对它们进行分组,我们可以依赖于PHP中的关联键是唯一的。

我在那里添加了u{id},因为某些PHP函数有一种方法可以放置数字键,这样可以避免成为问题。大多数时候它不需要,但它是预防性的,并且需要很少的努力,使得阵列更容易阅读和IMO一个好习惯。

最后,如果我在CSS中正确回忆,则id="10"#10{ ..no dice.. })的ID无效,但id="u10"之一是。{关于这方面的一些解释可以在这里找到

https://css-tricks.com/ids-cannot-start-with-a-number/

答案 2 :(得分:-1)

您可以通过uc.userid(和其他人)添加订单,这样在结果数组中,用户将拥有所有原始数据。在你的while循环中,你可以检查用户ID是否改变 - 然后是新用户。