【问题标题】:Join all the images to their relative page将所有图像加入其相关页面
【发布时间】:2015-10-05 11:52:28
【问题描述】:

我在 mysql 数据库中有两个表:页面和图像(现在,我更喜欢“图像”是文本)。我需要每个页面都显示他们所有的相关图像。例如:第一页显示3张图片,第二页显示4张图片,第三页没有图片等等。为了做到这一点,我创建了(遵循基本 cms 教程

https://www.youtube.com/watch?v=UbsAdx58ch0&list=PLfdtiltiRHWF0O8kS5D_3-nTzsFiPMOfM)

两个表进入一个数据库:

Pages:

id,label,title,body,slug,created,updated

Images:

id,page_id,content (for now, I prefer that the “image” is text)

不幸的是,我的查询只能显示一张图片,而不是与页面相关的所有图片,我不知道为什么。这里你是到page.php的查询:

require 'app/start.php';

if (empty($_GET['page'])) {
    $page = false;
} else {
    $slug = $_GET['page'];

    $page = $db->prepare("  
        SELECT pages.id, pages.label, pages.title, pages.body, pages.slug, pages.created, pages.updated, images.id, images.page_id, images.content AS image_content

        FROM pages

        LEFT JOIN images
        ON pages.id = images.page_id

        WHERE slug = :slug

    ");

    $page->execute(['slug' => $slug]); 

    $page = $page->fetch(PDO::FETCH_ASSOC);

    var_dump($page);

    if ($page) {
        $page['created'] = new DateTime($page['created']);

        if ($page['updated']) {
            $page['updated'] = new DateTime($page['updated']);
        }
    }
}

require VIEW_ROOT . '/page/show.php';

此查询产生以下源,例如相对于第一页:

array(9) {
  ["id"]=>
  string(1) "1"
  ["label"]=>
  string(20) "This is the first page"
  ["title"]=>
  string(22) "This is the first page"
  ["body"]=>
  string(8) "Some text"
  ["slug"]=>
  string(10) "first-page"
  ["created"]=>
  string(19) "2015-10-05 10:55:54"
  ["updated"]=>
  string(19) "2015-10-05 10:55:54"
  ["page_id"]=>
  string(1) "1"
  ["image_content"]=>
  string(8) "groundhog"
}

你怎么看,image_content只显示一个结果,但是images表的page_id记录了多个链接到页面id的图像。我哪里错了?

然后我尝试了这个解决方案:

<?php

require 'app/start.php';

if (empty($_GET['page'])) {
    $page = false;
} else {
    $slug = $_GET['page'];

    $page = $db->prepare("  
        SELECT pages.id, pages.label, pages.title, pages.body, pages.slug, pages.created, pages.updated, images.id, images.page_id, images.content AS image_content

        FROM pages

        LEFT JOIN images
        ON pages.id = images.page_id

        WHERE slug = :slug

    ");

    $page->execute(['slug' => $slug]); 

    $page = $page->fetchAll(PDO::FETCH_ASSOC);

    foreach ($page as $key) {
        $select[] = array('created'=>$key['created'], 'updated'=>$key['updated'], 'image_content'=>$key['image_content'], 'title'=>$key['title'], 'body'=>$key['body']);
}

    var_dump($key['image_content']);

    if ($page) {
        $key['created'] = new DateTime($key['created']);

        if ($key['updated']) {
            $key['updated'] = new DateTime($key['updated']);
        }
    }
}

require VIEW_ROOT . '/page/show.php';

现在我离我的目标更近了一点,但是使用这段代码,我得到了图像的相同名称,该名称重复了页面 id 在 page_id 列中重复的次数。 所以第1页有4张图片,最终结果是:“horse horse horse horse”。 第 2 页有 3 张图片,所以:“cat cat cat”

这里是 show.php:

<?php require VIEW_ROOT .'/templates/header.php'; ?>

    <?php if (!$page): ?>
        <p>No page found, sorry.</p>
    <?php else: ?>
        <h2><?php echo e($key['title']); ?></h2>

        <p><?php echo e($key['body']); ?></p>

        <p class="faded">
            Created on <?php echo e(($key['created']->format('jS M Y'))); ?>
            <?php if ($key['updated']): ?>
                last updated <?php echo e(($key['updated']->format('jS M Y h:i a'))); ?>
            <?php endif; ?>
            <br/>
            Images:
            <?php foreach($select as $result): ?>
                <?php echo e($key['image_content']); ?><br/>
            <?php endforeach; ?>

        </p>

<?php endif;?>

<?php require VIEW_ROOT .'/templates/footer.php'; ?>

【问题讨论】:

  • 显示运行此查询的 PHP 代码。编辑您的问题,不要将其添加到评论中

标签: php mysql database join content-management-system


【解决方案1】:

你只是fetching one row of your result。如果您想访问 SQL 查询的全部结果,您要么必须使用 fetchAll 获取结果,要么在遍历结果时单独处理每一行。

  1. 使用 fetchAll:

    $page_array = $page-&gt;fetchAll(PDO::FETCH_ASSOC);

  2. 使用循环:

    while($page_row = $page->fetch(PDO::FETCH_ASSOC)) { //do stuff }

编辑:

如果您在 show.php 中更改循环,它应该可以工作。

<?php foreach($page as $result): ?>
                <?php echo e($result['image_content']); ?><br/>
 <?php endforeach; ?>

fetchAll:

fetchAll 返回一个多维关联数组。对于查询结果中的每一行,都会将另一行添加到数组中。如果您的查询返回 3 行,您可以通过 $page[0]['variables'] 到 $page[2][variables] 访问它们。见here

键元素

我会考虑在你的 foreach-loop 非常糟糕的做法之后使用最后一个键数组。请参阅manual-page 上的第一个警告。

【讨论】:

  • 我按照你的建议尝试了,但我仍然不符合我的目标。怎么了?我编辑了主题
  • @user3323340 1. 你想用你的 $selected 完成什么?所有信息已经在关联数组 $page 中。 2. var_dump 必须在循环内。
  • Iskar,在 $selected[] 中,我将所有信息存储到特定变量中。如果我使用 fetchAll 我不能直接使用 $page['values'] 而不会得到未定义的索引消息错误
  • 我添加了 show.php,所以你可以看到我是如何使用 selected[] 数组的。将 var_dump 插入 foreach 并不能解决我的问题。
  • 感谢 Iskar,它有效。你是对的,我必须学习更多,更深入地学习。那些年我学到了很多东西,但我可以做得更多,你是对的。 “请参阅此处”链接报告一个不存在的页面。
猜你喜欢
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2010-11-02
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
相关资源
最近更新 更多