我正在尝试用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日
文本
视频
文本
图像
图像
还有其他方法可以做到这一点,或者这看起来是一种相当实用的方法吗?
答案 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 or
伏or
聪明`或其他东西。 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;它。