Ein eigenes, einfaches Blog mit PHP

Ein eigenes Blog hat man mit eigentlich recht schnell programmiert. Man benötigt nur eine MySQL-Tabelle für die Posts und ein paar Zeilen PHP-Code.

Ein Blog besteht in seinen Grundzügen aus vielen Posts. Jeder Post hat eine Überschrift (title), einen Text (content) und Uhrzeit und Datum der Erstellung (time). Außer diesen drei Spalten benötigt man nur mehr eine id, damit man jeden Post eindeutig identifizieren kann.

Das alles liefert die folgende MySQL-Tabelle, anbei auch zwei erste Test-Einträge:

CREATE TABLE `posts` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 `title` VARCHAR(255) NOT NULL,
 `content` TEXT NOT NULL,
 `time` INT NOT NULL
) DEFAULT CHARSET utf8;
 
INSERT INTO `posts` (`id`, `title`, `content`, `time`) VALUES(1, 'Ein erster langer Posteintrag', '<p>\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dui magna, bibendum eget venenatis id, luctus imperdiet nulla. Ut luctus, est at pellentesque gravida, lectus orci dignissim ante, quis sollicitudin lectus eros sed urna. Suspendisse egestas quam eget mauris suscipit malesuada. Aenean vehicula mauris id nisi tincidunt in faucibus massa laoreet. Donec dapibus malesuada dolor, vitae ornare lectus adipiscing non. Fusce mollis euismod sem semper porta. Praesent euismod orci quam, sit amet bibendum lectus. Vivamus id erat urna. Vivamus vitae pharetra est. Duis tempus tristique rhoncus. Cras fringilla mauris ac velit suscipit gravida. Curabitur vitae leo ultricies justo porta egestas. In porttitor, quam id mattis eleifend, massa tellus fermentum leo, quis gravida sapien elit in magna. Vestibulum ultricies ipsum vitae metus posuere posuere fringilla mi facilisis.\r\n</p>\r\n<p>\r\nSuspendisse vel tristique leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris hendrerit, erat ut aliquet egestas, ante orci sodales tortor, nec auctor metus enim ut augue. Duis et mi non justo ultrices lacinia eget eget magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi imperdiet venenatis ligula id fermentum. Quisque tristique iaculis bibendum. Donec facilisis, augue at iaculis lacinia, nisi turpis iaculis turpis, sit amet bibendum lorem neque vel lorem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris ut odio libero, ut viverra massa. Suspendisse id ante diam, vel euismod justo.\r\n</p>\r\n<p>\r\nSuspendisse potenti. Ut sit amet velit dolor, non accumsan turpis. Sed aliquam, ligula nec vestibulum dapibus, nibh nisl luctus mi, vel egestas magna diam vitae justo. Nam at diam nisi, sit amet luctus arcu. Nulla eleifend aliquet tortor eget malesuada. Sed lacinia dignissim ipsum, at vehicula mauris dapibus nec. Maecenas vestibulum nisi lacinia nisi consectetur et placerat massa accumsan. Curabitur hendrerit lorem quis est sagittis in posuere mi accumsan. Praesent vel lorem nec nibh congue malesuada. Aenean volutpat porttitor mi ut tincidunt. Maecenas molestie elementum tortor, pretium convallis ligula vehicula eu. Suspendisse potenti. Proin placerat interdum nisi, in mattis purus facilisis quis. Nunc eu mauris dolor. Aliquam et lectus nulla. Maecenas sodales luctus lectus et ultrices. In arcu nibh, pulvinar sed auctor vitae, lacinia at massa. Aliquam et ante enim. Curabitur non libero non nisl fermentum laoreet. Morbi odio erat, laoreet non rhoncus ut, sodales ut quam.\r\n</p>\r\n<p>\r\nInteger ipsum nunc, dictum id molestie a, vestibulum id purus. Integer fringilla erat id elit pharetra sit amet dapibus metus dapibus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc imperdiet pretium ipsum, at vestibulum orci iaculis eu. Phasellus fermentum lacinia feugiat. Sed sagittis ligula eget odio lacinia sed ultrices nisi dictum. Sed fringilla fringilla auctor. Ut id sapien nisi, eu convallis elit. In a libero vel est laoreet accumsan et ut felis. Cras sodales vestibulum risus sit amet sollicitudin. Praesent rutrum sodales nibh vel luctus. Aliquam rhoncus lacinia pellentesque. Proin sit amet commodo nisi. Vestibulum id porta eros. Donec mattis elit rutrum mauris bibendum ut rutrum sapien convallis. Nam tincidunt cursus nisl condimentum aliquet. Vestibulum pretium nisi non lorem dictum adipiscing. Duis at luctus est. Pellentesque porttitor ultricies metus, id bibendum mauris consectetur at.\r\n</p>\r\n<p>\r\nNulla elit massa, blandit ac viverra non, volutpat in dolor. Morbi commodo, tortor in iaculis molestie, turpis dui auctor dolor, id laoreet nisi nisi a eros. Quisque sit amet dapibus felis. Suspendisse nec justo sed mi malesuada auctor. Vivamus adipiscing lacinia erat, vel ullamcorper elit bibendum a. Quisque nec dui tellus. Nam eleifend tempor justo id gravida. Phasellus vitae risus lectus, a eleifend neque. Donec tincidunt sollicitudin lorem vel congue. Aliquam et ante nisi. In volutpat ultrices turpis, quis volutpat velit vestibulum vel. Nulla rhoncus elit eu odio faucibus aliquam. Vivamus et sapien sem, nec feugiat neque. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec erat lectus, ornare non adipiscing sed, luctus et massa. Proin sodales mauris a mauris feugiat tincidunt. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Vivamus lobortis felis lectus.\r\n</p>', 1305707282);
INSERT INTO `posts` (`id`, `title`, `content`, `time`) VALUES(2, 'Ein zweiter kurzer Eintrag', '<p>\r\nSuspendisse potenti. Ut sit amet velit dolor, non accumsan turpis. Sed aliquam, ligula nec vestibulum dapibus, nibh nisl luctus mi, vel egestas magna diam vitae justo. Nam at diam nisi, sit amet luctus arcu. Nulla eleifend aliquet tortor eget.\r\n</p>', 1305707601);

Das Blog hat nun eine Startseite, auf der wir die letzten 10 Posts in umgekehrter chronologischer Reihenfolge (neuester zuerst) auflisten. Jeder Eintrag hat einen Link, der die id des Posts als GET-Variabel post_id enhält und wenn man draufklickt an unser Skript übergibt.

Haben wir keine post_id, zeigen wir die gesamte Auflistung, gibt es schon eine, zeigen wir nur den Post, dafür in Vollansicht.

<?php
	$host = 'localhost';
	$user = '';
	$password = '';
	$database = '';
?><!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>Blog</title>
		<!--[if lt IE 9]>
		<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
		<![endif]-->
		<style type="text/css">
			body { font-family: Helvetica, sans-serif; font-size: 13px; }
			#container { width: 600px; margin: 0 auto; }
			header, article, footer { display: block; }
			article.item p.time { font-style: italic; }
			article.item h1, article.item p { margin: 0; }
			article.item { margin: 0 0 20px 0; }
		</style>
	</head>
	<body>
		<div id="container">
			<header class="main">
				<h1><a href="./">Blog</a></h1>
			</header>
<?php
	mysql_connect($host, $user, $password);
	mysql_select_db($database);
 
	if (empty($_GET['post_id'])) {
		$query = mysql_query('SELECT * FROM posts ORDER BY time DESC LIMIT 10');
		while ($post = mysql_fetch_object($query)) {
			$excerpt = $post->content;
			if (strlen($post->content) > 255) {
				$excerpt = substr($post->content, 0, 255).' ... ';
			}
?>
			<article class="item">
				<h1><a href="?post_id=<?=$post->id?>"><?=$post->title?></a></h1>
				<p class="time"><?=date('d.m.Y H:i:s', $post->time)?></p>
				<div class="content"><?=$excerpt?></div>
			</article>
<?php
		}
	} else {
		$post = mysql_fetch_object(mysql_query('SELECT * FROM posts WHERE id='.mysql_real_escape_string($_GET['post_id'])));
?>
			<article class="post">
				<h1><?=$post->title?></h1>
				<p class="time"><?=date('d.m.Y H:i:s', $post->time)?></p>
				<div class="content"><?=$post->content?></div>
			</article>
<?php
	}
?>
		</div>
	</body>
</html>

In der Auflistung kürzen wir den Text auf 255 Zeichen. Mit strlen erfahren wir wieviele Zeichen der Text hat. Hat er mehr als 255 schneiden wir mit substr die ersten 255 Zeichen aus dem Text und hängen drei Punkte an.

Die time würde ich als UNIX_TIMESTAMP in die Datenban speichern, deswegen muss ich sie im Skript auch mit date formatieren. Das kannst du natürlich nach deinem persönlichen Belieben anders umsetzen.