从一个 foreach 语句中检索变量,并在另一个 foreach 语句中显示


Retrieving variable from one foreach statement and displaying in another foreach statement

我正在尝试在另一个数组的 foreach 语句中使用一个数组中的变量。

我有一个网格视图,显示用户的个人资料照片,他们的显示名称,当前位置和可用性,以及使用他们的用户名来完成应用于框的链接。

用户的表保存;用户名(和用户ID)在将来需要时。

配置文件表保存;显示名称。

个人资料照片

表保存;个人资料照片。

位置

表保存;当前位置。

所有这些都通过与用户表匹配的user_id和用户名列在表中链接。

我为用户框准备的代码是;

<?php foreach($rows as $row): ?> 
<div class="box">
    <div class="boxInner">
      <a href="profile.php?username=<?php echo htmlentities($row['username'], ENT_QUOTES, 'UTF-8'); ?>&uid=<?php echo htmlentities($row['id'], ENT_QUOTES, 'UTF-8'); ?>">

      <img src="uploads/profile-photos/<?php echo htmlentities($pphoto['profilephoto_file'], ENT_QUOTES, 'UTF-8'); ?>" />

      <div class="titleBox" style="text-align:left; line-height:20px;">
      <span style="font-size:18px; font-weight:bold;"><i class="fa fa-user"></i> <?php echo htmlentities($row['profile_displayname'], ENT_QUOTES, 'UTF-8'); ?>,
      <?php echo htmlentities($row['profile_displayage'], ENT_QUOTES, 'UTF-8'); ?></span>
      <br />
      <span style="font-size:14px;"><i class="fa fa-map-marker"></i> City Name &nbsp;|&nbsp; <i class="fa fa-clock-o"></i> Now</span>
      </div></a>
    </div>
  </div>
<?php endforeach; ?> 

我的SQL查询和数组代码是;

$query = " 
        SELECT 
            users.id, 
            users.username,
            users.email,
            profiles.profile_displayname,
            profiles.profile_displayage,
            profiles.profile_photo
        FROM users, profiles
        WHERE users.id = profiles.user_id;
    "; 
    try 
    { 
        // These two statements run the query against your database table. 
        $stmt = $db->prepare($query); 
        $stmt->execute(); 
    } 
    catch(PDOException $ex) 
    { 
        // Note: On a production website, you should not output $ex->getMessage(). 
        // It may provide an attacker with helpful information about your code.  
        die("Failed to run query: " . $ex->getMessage()); 
    } 
    // Finally, we can retrieve all of the found rows into an array using fetchAll 
    $rows = $stmt->fetchAll(); 
    $query = " 
        SELECT 
            users.id, 
            users.username,
            profilephotos.user_id,
            profilephotos.profilephoto_file
        FROM users, profilephotos
        WHERE users.id = profilephotos.user_id;
    "; 
    try 
    { 
        // These two statements run the query against your database table. 
        $stmt = $db->prepare($query); 
        $stmt->execute(); 
    } 
    catch(PDOException $ex) 
    { 
        // Note: On a production website, you should not output $ex->getMessage(). 
        // It may provide an attacker with helpful information about your code.  
        die("Failed to run query: " . $ex->getMessage()); 
    } 
    // Finally, we can retrieve all of the found rows into an array using fetchAll 
    $profilephotos = $stmt->fetchAll(PDO::FETCH_ASSOC);

无论我尝试什么 - 我就是无法让foreach拉入正确的图像。我已经设法拉入了一个图像,但 foreach 语句将相同的图像应用于每个用户,而不管我指示查询$profilephotos查找的 ID 如何。

我做错了什么?我这样做的方式是否正确?

任何帮助将不胜感激 - 请注意,虽然我是PHP的新手。

您需要一个查询而不是两个查询。查询可能如下所示:

SELECT 
            users.id AS id, 
            users.username AS username,
            users.email as email,
            profilephotos.profilephoto_file AS file_photo,
            profiles.profile_displayname AS file_displayname,
            profiles.profile_displayage AS displaypage,
            profiles.profile_photo AS photo
        FROM users
        JOIN profilephotos ON users.id = profilephotos.user_id
        JOIN profiles ON users.id = profiles.user_id;

你需要两个使用连接 - 这是更好的做法。并注意关键字"AS"——它有助于消除不同表中相同列名的歧义。

如果您想查看其中一个查询变体(使用最新的个人资料图像),就是这样:

SELECT 
            users.id AS id, 
            users.username AS username,
            users.email as email,
            profilephotos.profilephoto_file AS file_photo,
            profiles.profile_displayname AS file_displayname,
            profiles.profile_displayage AS displaypage,
            profiles.profile_photo AS photo
        FROM users
        LEFT JOIN profiles ON users.id = profiles.user_id
        LEFT JOIN profilephotos ON users.id = profilephotos.user_id
        WHERE profilephotos.id in (select max(id) from profilephotos group by user_id)
        ORDER BY id

但我认为它太复杂了,可能完全是错误的,因为我不知道你的表架构。