php - 将所有图像加入到其相关页面

标签 php mysql database join content-management-system

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

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

将两个表放入数据库:

页数:

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

图片:

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只显示了一个结果,但是图像表的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 张图片,因此:“猫猫猫”

这里是 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'; ?>

最佳答案

你只是fetching one row of your result 。如果您想访问 SQL 查询的整个结果,您必须使用 fetchAll 获取结果。或在循环结果时单独处理每一行。

  1. 使用 fetchAll:

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

  2. 使用循环:

    while($page_row = $page->fetch(PDO::FETCH_ASSOC)) {//做一些事情 }

编辑:

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

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

获取全部:

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

关键元素

我认为在 foreach 循环之后使用最后一个键数组是非常糟糕的做法。请参阅 manual-page 上的第一个警告.

关于php - 将所有图像加入到其相关页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32947983/

相关文章:

mysql - 使用查询连接多个表

php - 将存储的数据库日期更改为当前时区(strtotime?)

javascript - JSON从php到JS文件

php - 关联数组php mysql

mysql - 在 CIDR 范围 MySQL 中查找 IPv6 的正确方法

database - Zend Framework 动态 ACL 具有特殊权限,具体取决于数据库条目

php - 如何使用其键将数组分组为子数组?

php - 在javascript中嵌入php变量时出现"SyntaxError: unterminated string literal"错误

php - 如何在一个查询中编写 asc 和

mysql - 如何计算所有列中的数字或出现次数并使用 MySQL 列出它们?