MySQL:在不同的点创建一个包含不同数据类型的博客风格页面

时间:2017-06-04 18:16:16

标签: javascript php html mysql

我正在尝试用PHP和MySQL开发类似的东西:http://a-bittersweet-life.tumblr.com/

我想创建一个主要由单词组成的页面,但可以穿插图像或嵌入的视频或其他数据类型。我不确定如何做到这一点,但我有一个想法:

id | entry_date |  text | image_link | vid_embed | sound_embed
 0 |   June 1st |  data |    null    |   null    |  null 
 1 |   June 1st |  null |    data    |   null    |  null   
 2 |   June 1st |  null |    data    |   null    |  null  
 3 |   June 1st |  data |    null    |   null    |  null  
 4 |   June 2nd |  data |    null    |   null    |  null   
 5 |   June 2nd |  null |    null    |   data    |  null   
 6 |   June 2nd |  data |    null    |   null    |  null  
 7 |   June 2nd |  null |    data    |   null    |  null   
 8 |   June 2nd |  null |    data    |   null    |  null   
 ....
 ....
 ....       

因此,对于每个博客条目,首先显示日期,然后显示数据放入SQL表的顺序(按ID排序):

6月1日

  • 文本
  • 图像
  • 图像
  • 文本

6月2日

  • 文本

  • 视频

  • 文本

  • 图像

  • 图像

还有其他方法可以做到这一点,或者这看起来是一种相当实用的方法吗?

3 个答案:

答案 0 :(得分:3)

这是一个使用普通php的简单示例。如果你使用一些php框架,你可以将一些部分替换成更简单的部分,但这里是GIST。

我创建了2个函数,所以你可以创建类和方法或构建MVC甚至使用这个函数,它只是概念......

<?php
declare(strict_types = 1);
// This function will provide data from DB.
// Here I`ve skipped validation
// because I had relied on PHP7 scalar type declarations.
function getDataFromDB(int $limit, int $offset) {
    $db = new \PDO('mysql:dbname={YOUR_DB};host={YOUR_HOST}', '{USER}', '{PASS}');
    // Here I`ve used super simple SQL,
    // but you can improve it
    // and filters by date or author or category or something else...
    $sql = sprintf(
        '
            SELECT *
            FROM {YOUR_TABLE_NAME}
            ORDER BY entry_date DESC
            LIMIT %d OFFSET %d
        ',
        $limit,
        $offset
    );
    // In this query, I`ve only provided params for pagination
    // because they are required on the first stage...
    $s = $db->prepare($sql);
    if (!$s->execute()) {
        throw new \RuntimeException($s->errorInfo());
    }
    // Next param is very IMPORTANT,
    // it will group data into array with format where:
    // key - date and value - array of posts, like:
    // array (
    //   'June 1st' => array (
    //     0 => array ('text' => '...', 'image_link' => ...),
    //     1 => array ('text' => '...', 'image_link' => ...),
    //   ),
    //   'June 2nd' => array (
    //     0 => array ('text' => '...', 'image_link' => ...),
    //     1 => array ('text' => '...', 'image_link' => ...),
    //     2 => array ('text' => '...', 'image_link' => ...),
    //     3 => array ('text' => '...', 'image_link' => ...),
    //   )
    // )
    return $s->fetchAll(\PDO::FETCH_GROUP | \PDO::FETCH_ASSOC);

}

现在你可以使用这个函数来从db获取数据并将其传递给下一个函数,它将准备html或json或其他东西......

// This function will render data.
function render(array $data) {
    $html = '';
    foreach ($data as $day => $posts) {
        // Caption for certain day, like 'June 1st' or 'June 2nd'.
        $html .= sprintf('<div class="dayPosts"><div class="day">%s</div>', $day);
        foreach ($posts as $post) {
            // Particular blog post.
            // It is super simple HEREDOC example,
            // but you can do here anything you wish.
            $html .= <<<"BLOGPOST"
                <div class="post">
                    <h3>{$post['title']}</h3>
                    <div class="content">
                        <img src="{$post['image_link']}">
                        <p class="text"{$post['test']}></p>
                        <video controls>
                            <source src="{$post['vid_embed']}" type="video/mp4">
                        </video>
                    </div>
                </div>
BLOGPOST;
        }
        $html .= '</div>';
    }
    return $html;
}

在这里,我ve used plain php functions with purposer to prepare html, but you cna use something better like twig oror聪明`或其他东西。 Alsom你可以把这个函数放到视图中或以某种方式重构......

最后一步,将所有人连接在一起:

// Now you can get and render your content.
echo render(getDataFromDB(20, 0));
PS:Ti只是原始的例子......但是现在必须知道下一步该做什么!
希望它会对你有所帮助!

答案 1 :(得分:2)

似乎这样做的简单方法是获取所有行,然后遍历它们并使用if语句来确定类型。

$sql = "SELECT * FROM Schema.Table WHERE CAST(entry_date AS DATE) BETWEEN '06/01/2017' AND '06/02/2017' ORDER BY id";
/* Query your database however you might do */

$lastDay = null;
while ($row in $sqlResult->fetch_row()) {
    if ($row->entry_date != $lastDay) {
        $lastDay = $row->entry_date;
        echo $row->entry_date;
    }
    if ($row->text != null) {
        echo $row->text;
    } else if ($row->vid_embed != null) {
        echo '<videoplayer src="' + $row->vid_embed + '">';
    } else if ($row->image_link != null) {
        echo '<img src="' + $row->image_link + '">';
    } else if ($row->sound_embed!= null) {
        echo '<soundplayer src="' + $row->sound_embed+ '">';
    }
}

这有点像伪代码,但方法应该没有问题。

答案 2 :(得分:1)

或者从HTML中获取提示。

blah blah -- text
<img src=...> -- image
etc.

或者有两列;一个说MIME类型(或者你想对它们进行分类),一个是有问题的数据。

HTML的另一个提示:不要将图像,视频或声音放在表格单元格中;把一个&#39;链接&#39;它。