PHPで日記システムを作ってみる1

WordPressでも事足りるのだが、それほど機能が多くなくシンプルな日記システムが欲しかったので作って見ることにした。機能的には

  • 日記がかける
  • 日記が見れる
  • 日記に対してコメントが付けられる

この程度のものを作ってみよう。

システム構成は

  • Apache
  • PHP
  • MySQL

まずは、日記の本文をどう保存するか考える。DBに必要そうな項目は

  • ID
  • 日付
  • タイトル
  • 本文
  • 最終更新日

とりあえずはこんなもんかな。そして、DBの作成に着手していく。
まずは、データベースの作成と、そのDBにアクセスするユーザの作成。

mysql -u root -p
mysal> create database diary;
mysql> grant all privileges on diary.* to diary@localhost identified by 'password';
mysql> exit;

これで、diaryというデータベースを作成し、diaryというユーザ名でパスワードがpasswordというdiaryデータベースにのみフルアクセスできるユーザを作成できた。
(diaryばっかでよくわからんな(笑))

次に、ユーザdiaryでDBにアクセスし、テーブルの作成を行う。

mysql -u diary -p
mysql> use diary;
mysql> create table diary ( id smallint unsigned not null auto_increment,
date date not null, title text not null, body mediumtext not null,
lastUpdate datetime not null,
primary key(id)) engine = myisam;

idは0から65535まで、1日件書いたといて179年はもつ。
dateは日付で、titleは最長65535バイト、bodyは本文で最長16772215バイト。lastUpdateは最終更新日時で時分秒。
そして、トランザクションは使う予定がないので、エンジンはmyisamにした。

DBの準備ができたので、今度は投稿画面を作ってみたいと思う。

<?php

require_once('./Diary.php');

main();

function main()
{
    $diary = new Diary();
    $diary->main();
}

?>

アクセス先となるindex.phpではDairyクラスをインスタンス化し、mainメソッドを呼び出す。

<?php

function yaslog($message) {
    error_log($message);
}

class Diary {
    protected static $type;
    protected static $date;
    protected static $title;
    protected static $body;

    const BASE_DIR = './';

    public function __construct() {
        yaslog("Diary __construct");

        if(!isset($_POST)) {
            self::$type = 'None';
            return;
        }

        if(array_key_exists('type', $_POST)) {
            self::$type = $_POST['type'];
        } else {
            self::$type = 'None';
        }

        if(array_key_exists('date', $_POST)) {
            self::$date = $_POST['date'];
        }

        if(array_key_exists('title', $_POST)) {
            self::$title = $_POST['title'];
        }

        if(array_key_exists('body', $_POST)) {
            self::$body = $_POST['body'];
        }
    }

    public function main()
    {
        $this->createAndExec(self::$type);
    }

    protected function exec()
    {
        yaslog('Diary base exec is not working');
    }

    private function createAndExec($name)
    {
        $className = "Diary{$name}";
        $ret = include_once($this::BASE_DIR . $className . ".php");

        yaslog('include ret = ' . $ret);

        if($ret == false) {
            echo("Diary inherit class php file not found -> " . $className);
            return;
        }

        $obj = new $className();
        $obj->exec();
    }
}

Dairy.phpでは共通で必要なPOSTされた値をクラスのstaticメンバに読み込み、typeにごとに必要な処理を行うようにする。
簡単なルールとして、typeごとにDairyクラスを継承して、DairyXXXとXXXの部分をtypeで渡された文字列で置き換えたクラスを作成する。
DairyXXXクラスではexecというメソッドをオーバーロードして、必要な処理と表示を行う。

それでは、次にPOSTに何も指定されなかった時の画面を作成する。
今回は、このページが投稿画面となる。

<?php

require_once('./Diary.php');

class DiaryNone extends Diary
{
	public function __construct()
	{
		yaslog('DiaryNone');
	}

	protected function exec()
	{
?>

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>日記</title>
 </head>

 <body>
  <form action="./" method="post">
   <input type="hidden" name="type" value="Create" />
   <div>
    <div>日付:<input type="date" name="date" /></div>
    <div>タイトル:<input type="text" name="title" /></div>
    <div>
     <div>本文:</div>
      <div>
       <textarea name="body"></textarea>
      </div>
     </div>
     <div><input type="submit" value="投稿" /></div>
   </div>
  </form>
 </body>
</html>

<?php
	}
}

DairyNone.phpでは投稿画面のhtmlを表示するだけの機能である。
execメソッドの中で、投稿画面をhtmlでフォームを作り表示している。

次は、実際に投稿された文章を書き込み結果を表示する画面。

<?php

require_once('./Diary.php');

class DiaryCreate extends Diary
{
	protected function exec()
	{
		$now = date('Y-m-d H:i:s');
		$db = new PDO('mysql:host=localhost;dbname=diary', 'diary', 'password');

		$sql = "insert into diary values (null, '" . self::$date
			. "', '" . self::$title . "', '" . self::$body . "', '{$now}')";
		yaslog($sql);
		$result = $db->exec($sql);

		if($result === FALSE) {
			print_r($db->errorInfo());
			die('db error');
		}

		unset($db);

?>

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>日記 投稿完了</title>
 </head>
 <body>
  投稿完了<br>
  <a href="./">戻る</a>
 </body>
</html>

<?php
	}
}

execメソッドの中で、DBへの書き込みを行なっている。
DBへの書き込みが成功した場合には、投稿完了と表示し、「戻る」リンクを表示する。
とりあえず、これで書き込むことはできた。しかし、日付などはちゃんと自前で入れてやらないとチェック処理をしていないのでエラーになったりするし、SQLインジェクションとかできたりしそう。

でも、次回はほおっておいて表示部分を作ってみる。

「PHPで日記システムを作ってみる1」への4件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください