【问题标题】:Duplicate records during a foreach loop在 foreach 循环期间重复记录
【发布时间】:2013-06-19 18:29:31
【问题描述】:

我有一个查询,它会提取新闻故事,然后附加与特定故事相关的所有照片。这一切都很好,但我最近添加了一个功能来提取与故事相关的视频,它会导致显示重复的图像或视频链接。

例如,我有一个包含 3 张图片和 1 个视频的新闻报道。目前它在每张图片旁边发布一个视频,因此它显示了 3 次。我真正想要展示的是新闻报道,然后是图片,然后是视频。

这里是php

$sLastStory = '';
foreach ($result AS $row)
{
    $sStory = $row['headline'] . $row['story'];
    if (strcasecmp($sStory, $sLastStory) != 0)
    {
        if (!empty($sLastStory))
        {
            print('<hr>' . PHP_EOL);
        }
        $sLastStory = $sStory;


        printf('<h2>%s</h2>' . PHP_EOL, $row['headline']);

        printf('<a href="parknews.php?park_id=%s">
        <h3>%s</a> - %s</h3>' . PHP_EOL, $row['park_id'], $row['name'], $row['Displaydate']);

        printf('<p>%s</p>' . PHP_EOL, $row['story']);
    }

if(!empty($row['url'])){   
printf('
<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s - Credit - %s" >
<img src="/images/%s%s-thumb.jpg" style="min-height: 200px; min-width: 200px" alt="%s"/></a>' . PHP_EOL, $row['url'], $row['alt'], $row['headline'],  $row['description'],$row['credit'], $row['url'], $row['alt'], $row['alt'] );
}

if(!empty($row['location'])){   
printf('<iframe width="640" height="360" src="%s" frameborder="0" allowfullscreen></iframe>' . PHP_EOL, $row['location'] );
}

}

我对 PHP 不是很好,只是复制了这部分:

if(!empty($row['url'])){   
printf('
<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s - Credit - %s" >
<img src="/images/%s%s-thumb.jpg" style="min-height: 200px; min-width: 200px" alt="%s"/></a>' . PHP_EOL, $row['url'], $row['alt'], $row['headline'],  $row['description'],$row['credit'], $row['url'], $row['alt'], $row['alt'] );
}

然后将其粘贴在下面,但将其更改为视频查询而不是图像。 任何想法如何修复它以正确显示? 谢谢

编辑:这是查询

try
{
$sql = 'SELECT headline, story, DATE_FORMAT(date, "%d-%M-%Y") AS Displaydate, name, logo, tpf_parks.park_id, url, alt, description, credit, location
FROM tpf_news
INNER JOIN tpf_parks ON tpf_news.park_id = tpf_parks.park_id 
LEFT JOIN tpf_images ON tpf_news.news_id = tpf_images.news_id 
LEFT JOIN tpf_videos ON tpf_news.news_id = tpf_videos.news_id 
ORDER BY date DESC' ;
$result = $pdo->query($sql);
}

【问题讨论】:

  • 请发布您用来检索这些行的查询,我怀疑您正在进行交叉连接。
  • 据我所见,如果您的 SQL 语句同时拉起两者,这可能是您的 SQL 语句的问题。但最好使用两个单独的语句并单独循环它们。一张图片,一张视频。
  • 只是编辑问题 - 查询现在在那里。
  • 根据您的 SQL,视频 url 和图像 url 有什么区别?您没有在查询中指定。
  • 视频 url 在 tpf_videos 表中称为“位置”,而图像 url 在 tpf-images 中分为两部分,称为“url”和“alt”。所以应该没有命名交叉

标签: php sql


【解决方案1】:

如果不做一些实际测试很难说,但我会尝试处理您的 $resultarray_unique($result),看看这是否不能消除重复。

正如上面其他人所说,看看你是否可以为我们print_r($result),也许我们可以弄清楚发生了什么。如果可以的话,也发布 SQL fetch 行。

【讨论】:

  • 如果array_unique能解决这个问题,SQL语句需要写得更好,而不是使用这个函数。
  • @Jon:同意,但这是排除故障与重写整个 SQL 查询的一行代码。
  • 如前所述,我不擅长编码!我该怎么做 print_r($result)?
【解决方案2】:

SQL 的编写方式是为每张照片返回一行,或者 视频,但视频行还包含指向照片的链接,反之亦然。 你真正想要的是一个UNION,它表达了你展示的意图 照片和视频的总和。我建议使用两个查询。这 首先会得到故事的细节。

第二个会得到照片和视频。然后你可以合并 基于 news_id 的数据结构。

 SELECT tpf_news_id, ... FROM tpf_images JOIN tpf_news ON tpf_news.news_id = tpf_images.news_id
 UNION
 SELECT tpf_news_id, ... FROM tpf_videos JOIN tpf_news ON tpf_news.news_id = tpf_videos.news_id;

当您使用UNION 时,您需要确保输出相同的名称 以及两个查询中的列数。

在您的代码中,您可以循环遍历新闻项目,然后在 循环播放照片和视频,无需重复检查以查看是否 这个新闻故事与上一个故事是重复的。

【讨论】:

  • 你有没有机会把它混在一起。我以前从未使用过 UNION,充其量只是个新手。听起来我需要改变很多。谢谢
  • 是的,在 UNION 的每个部分中,您还可以选择标题、故事等。所有行都将包含故事详细信息,然后是图像详细信息和空视频详细信息,或者空图像详细信息,但视频详情。您的代码将与您现在的代码更加相似。我不认为这清楚地表达了您的意图,但它会起作用。给 UNION 一个机会,我想你会发现它相当容易。假设 MySQL,这里有一些文档:dev.mysql.com/doc/refman/5.0/en/union.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2014-01-06
  • 1970-01-01
相关资源
最近更新 更多