【问题标题】:PHP/MySQL: Limit foreach loop when more than one occurance is foundPHP/MySQL:发现不止一次出现时限制 foreach 循环
【发布时间】:2020-05-13 17:43:32
【问题描述】:

我是 PHP 和 MySQL 的新手,我目前正在制作博客门户。在索引页面上,所有最近的帖子都会显示标题、作者、日期、帖子的前 150 个字符以及帖子中的图片。

我在 MySQL 中有两个表:“post”和“image”,我正在使用 foreach 循环遍历这两个表,以检查一个帖子是否有一个具有相同 postId 的图像连接到它。我的问题是,如果一篇文章有​​不止一张图片,我只希望显示一张图片,而不是所有图片都像现在这样。我尝试从 post.id = image.postId 的用户中选择所有帖子进行查询,但是没有显示没有图像的帖子。

感谢任何关于如何使这项工作发挥作用的意见或建议,或者完全不同的方法。

在 PHP/HTML 文件中(删除了循环中添加标题/内容等的部分代码):

<?php foreach($allPosts as $key => $onePost): ?>

    <?php foreach($allImages as $one => $oneImage): ?>

        <?php if ($oneImage['postId'] === $onePost['id']): ?>
         <?php echo '<img src="../Images/' . $oneImage['filename'] . $secondString; ?>
        <?php endif; ?>

    <?php endforeach;?>
<?php endforeach;?>

在 PHP/数据库文件中:

function selectAllPosts($conn)
{
    $sql = '
    SELECT p.*
         , u.username 
      FROM post p 
      JOIN users u 
        ON p.userId = u.id 
     ORDER 
        BY created DESC
    ';
    return $allPosts = db_select($conn, $sql);
}


function selectAllImages($conn)
{
    $sql = 'SELECT * FROM image';
    return $postImages = db_select($conn, $sql);
}

【问题讨论】:

  • 如果是我,我会暂时忘记所有非 sql 的东西,而是专注于查询
  • 提示:您不需要为每个语句打开&lt;?php 和关闭?&gt; 标签。只需在 php 脚本的开头打开一个标签数据,然后在结束时关闭它。

标签: php html css mysql blogs


【解决方案1】:

您可以通过添加“位置”和“限制”来限制您的图像查询。

这样的事情可能会奏效:

'SELECT * FROM image WHERE image.postId=post.id LIMIT 1'

这种方法假设每张图片都有属性'postId',即包含图片的帖子的id

注意:使用此查询,未定义您在限制后获得的图像。实际上,它主要是首先保存在数据库中的图像,但它可能会有所不同。如果要获取特定图像,可以向图像表添加一些布尔列,例如'hero-image' 并使用此查询

'SELECT * FROM image WHERE image.postId=post.id AND image.hero=true LIMIT 1'

【讨论】:

    【解决方案2】:

    好的,为了安全起见,我首先建议您在连接到数据库时使用 PDO(请参阅https://www.udemy.com/course/php7-beginners-guide-to-database-pdo/

    从数据库中只获取一张图片的简单方法是:

    $sql = 'SELECT * FROM image LIMIT 1';
    

    您的图片表的结构如何?您是否在挑剔显示哪个图像?如果是这样,在加载记录时,您可以将一个字段用于首选图像位置,而将另一个或其他字段用于其余部分,然后您可以从首选图像字段中选择您的图像(如果存在)。

    或者,您可以将图像位置存储在数组中,并且只选择数组中的第一个(参见:https://www.php.net/manual/en/function.mysql-fetch-array.php

    由于某些记录中没有图像位置,因此您还需要在显示代码中包含一个过滤器,例如:

    if(empty($row['image'])){
    
    }
    else{
    echo 'Your image display code Here';
    }
    

    【讨论】:

    • 图像表有一个唯一的 id、文件名和 postId,因此如果多个图像属于同一个帖子,它们可以具有相同的 postId。不,显示帖子中的哪一张图片并不重要。
    • 也许前进的方向是在帖子记录中添加另一个字段,例如“firststimage”,当您添加新记录时,只需将一个图像位置添加到该字段,然后您可以在提取帖子记录时使用它,而无需转到图像表 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2016-10-25
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多