我从MySQL表中提取新闻,显示标题,故事和日期等内容。这些新闻故事是从PHP foreach循环生成的,并且工作正常。
我还有两个MySQL表,一个用于图像,一个用于视频。这些表有一个名为news_id的列,它与新闻表的唯一字段相链接。这个想法是每个新闻故事都会自动显示附加的任何视频或图像。
但是这个代码不能正常工作 - 例如如果故事有3个匹配的图像和一个视频,它实际上输出该视频3次,每个图片旁边一个。如果有5个视频和一个图片相同,则会显示该图片5次。
当它只是在新闻旁边拉图像时,代码工作正常,但由于我添加了视频表,问题也开始了。我想我需要重写查询和foreach循环但不知道如何。我的猜测是我需要在主要的foreach中使用两个foreach循环 - 一个用于图像,一个用于视频。
我希望它如何工作:
新闻表的标题,日期和故事
从图像表中提取的任何photo_url
从视频表中提取的所有video_url
然后是下一个标题,依此类推。任何人都可以帮我构建这个吗?
作为参考,这是当前使用的查询:
$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);
和当前使用的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('<h3><a href="parknews.php?park_id=%s">
%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="max-height: 250px; max-width: 250px" 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" allowfullscreen></iframe>' . PHP_EOL, $row['location'] );
}
}
如何使此代码正常工作以显示我想要的数据? 但正如我所说,我认为这一切都需要完全改写。
答案 0 :(得分:1)
您可以使用GROUP_CONCAT
。这将返回一个连接的字符串,然后您可以explode()
。这将使每个标题返回1行,这样您就可以轻松地对图像和视频进行分组。
$sql = 'SELECT headline, story, DATE_FORMAT(date, "%d-%M-%Y") AS Displaydate,
name, logo, tpf_parks.park_id,
GROUP_CONCAT(url) as url, GROUP_CONCAT(alt) as alt, GROUP_CONCAT(description) as description,
GROUP_CONCAT(credit) as credit, GROUP_CONCAT(DISTINCT location) as 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
GROUP BY tpf_images.news_id, tpf_videos.news_id
ORDER BY date DESC' ;
$result = $pdo->query($sql);
然后在循环中,对每个连接的列使用explode()
-
if(!empty($row['url'])){
$url=explode(',',$row['url']);
$alt=explode(',',$row['alt']);
$description=explode(',',$row['description']);
$credit=explode(',',$row['credit']);
for($i=0;$i<count($url);$i++){
printf('
<a href="/images/%s%s.jpg" rel="lightbox[%s]" title="%s - Credit - %s" >
<img src="/images/%s%s-thumb.jpg" style="max-height: 250px; max-width: 250px" alt="%s"/></a>' . PHP_EOL, $url[$i], $alt[$i], $row['headline'], $description[$i],$credit[$i], $url[$i], $alt[$i], $alt[$i] );
}
}
if(!empty($row['location'])){
$location=explode(',',$row['location']);
for($j=0;$j<count($location);$j++){
printf('<iframe width="640" height="360" src="%s" allowfullscreen></iframe>' . PHP_EOL, $location[$j] );
}
}