我想我需要在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个)出现在同一行的同一行中,而不会在表格中复制相同的用户。
感谢您的帮助。
答案 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"
之一是。{关于这方面的一些解释可以在这里找到
答案 2 :(得分:-1)
您可以通过uc.userid(和其他人)添加订单,这样在结果数组中,用户将拥有所有原始数据。在你的while循环中,你可以检查用户ID是否改变 - 然后是新用户。