【PHP入門】プレーンなPHPでブログを作成する・その3【モデル&DB編】

前回

前回はルーティングとビューを作成した。今回はDBとのやり取りの要であるモデルを作成し、マイグレーションを作成する。

1.モデル

User.phpは下記の通り。

<?php

class User {
    function __construct(){
        // PDO settings
        $dsn = 'mysql:dbname=php_blog;host=mysql';
        $user = 'default';
        $password = 'default';

        try{
            $this->dbh = new PDO($dsn,$user,$password);
        }catch(PDOException $e){
            echo 'Connection failed: ' . $e->getMessage();
        }
    }

    function create($value){
        $sql = 'INSERT INTO users (username,password) VALUE (:username,:password)';
        $sth = $this->dbh->prepare($sql);
        foreach($value as $key => $elem){
            if($key === 'password'){
                $value[':'.$key] = password_hash($elem,PASSWORD_DEFAULT);
            }else{
                $value[':'.$key] = $elem;
            }
            unset($value[$key]);
        }
        $sth->execute($value);
    }
    function validate_password($username,$password){
        $sql = 'SELECT password from users where username = :username';
        $sth = $this->dbh->prepare($sql);
        $sth->execute([':username'=>$username]);
        $user = $sth->fetch();
        if($user){
            return password_verify($password,$user['password']);
        }else{
            return false;
        }
    }
}

コンストラクタでPDOの設定をして、create()とvalidate_password()を実装する。

Blog.phpは下記の通り。

<?php

class Blog {
    function __construct(){
        // PDO settings
        $dsn = 'mysql:dbname=php_blog;host=mysql';
        $user = 'default';
        $password = 'default';

        try{
            $this->dbh = new PDO($dsn,$user,$password);
        }catch(PDOException $e){
            echo 'Connection failed: ' . $e->getMessage();
        }
    }

    function create($value){
        $date = date('Y-m-d H:i:s');
        $sql = "INSERT INTO blogs (title,content,private,created_at,updated_at) VALUE (:title,:content,:private,'". $date ."','". $date ."')";
        $sth = $this->dbh->prepare($sql);
        foreach($value as $key => $elem){
            $value[':'.$key] = $elem;
            unset($value[$key]);
        }
        $sth->execute($value);
    }

    function read($id=null){
        if(empty($id)){
            // Get all
            $sql = 'SELECT * FROM blogs ORDER BY updated_at DESC;';
            $sth = $this->dbh->prepare($sql);
            $sth->execute();
            return $sth->fetchAll();
        }else{
            // Get one
        }
    }

    function delete($id){
        $sql = 'DELETE FROM blogs WHERE id =' .$id;
        $sth = $this->dbh->prepare($sql);
        $sth->execute();
    }
}

同じくコンストラクタでPDOを設定し、create()、read()、delete()を実装する。

2.データベース

マイグレーションはinit.ddlというファイルを作成し、SQLを書き込んでいく。

「mysql (データベース名) < init.ddl」で実行できる。

CREATE DATABASE IF NOT EXISTS php_blog;

CREATE USER IF NOT EXISTS 'default' IDENTIFIED BY 'default';

GRANT ALL ON *.* TO 'default';

CREATE TABLE blogs (
    id int AUTO_INCREMENT,
    title varchar(255),
    content varchar(255),
    private boolean NOT NULL DEFAULT '0',
    created_at datetime,
    updated_at datetime,
    index(id)
);

CREATE TABLE users (
    id int AUTO_INCREMENT,
    username varchar(255),
    password varchar(255),
    index(id)
);

シーディングも同様にseed.dmlファイルを作成する。パスワードはハッシュ化したものを入れる。

INSERT INTO users (username,password) VALUES ('user01','$2y$10$oPNrQ4SOvam/JVwcyORKoO6EYJQkI3i6PYqqEKGTmOykH4jnpqJpu');
INSERT INTO blogs (title,content,created_at,updated_at) VALUES ('花が咲きました','今年もネモフィラが満開です。','2020-07-30','2020-07-30');
INSERT INTO blogs (title,content,created_at,updated_at) VALUES ('読書をしました','先生におすすめされた本を読んでみました。。','2020-07-28','2020-07-28');

まとめ

今回のブログ作成では単純な読み書きしかしないので、モデルのメソッドも少なく、実装はさほど難しくないと思う。モデルの中にSQLを書くなんてことは実際には中々やらないと思うが、今回はビューとDBの分離が行えれば良いのでそこは気にしないでおく。

次回は認証部分を実装していよいよ完成とする。

コメントを残す

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

CAPTCHA