RのWeb制作

Webサービス制作のための技術情報を。データ分析(Python、機械学習コンペ他)や自作野球ゲームMeisyoのこと中心。

Web制作

[PHP]まとめ読みをPSRで改良する(4)

投稿日:


まとめ読みをPSRで改良する(3)から約一週間。

こんがらがっていた頭の中がすっきりして、なんとなくですがオブジェクト指向がわかってきたような気がします。

オブジェクト指向で大事そうなのは、機構(機能の固まり)を分けること。
データベースへの通信ならそれだけで1つの変数に格納する。

たとえば「$dataBase->….;」という感じで。

これだと名前空間の汚染?が無くなる。自作の関数被りが無くなるって言った方がわかりやすいかな。

そしてPSR規則にのっとりつつ・・・って感じですね。

<?
require_once 'SplClassLoader.php';
require_once 'password.php';
require_once 'Mobile_Detect.php';

// クラスローダー
$classloaderBase = new SplClassLoader('ReiFarms', './lib');
$classloaderBase->register();

// 拡張
$dataBase = new ReiFarms\DataBase();
$config = new ReiFarms\Matomeyomi\Config();
$display = new ReiFarms\Matomeyomi\Display();

// MySql
$dataBase::setInfo($config->dbInfo);

携帯判定(mobile_detect)もそのまま使えました。

// 携帯判定
$detect = new Mobile_Detect;
if(empty($_SESSION['isMobile']))
{
    $_SESSION['isMobile'] = $detect->isMobile() ? true : false;
}

これは便利!

本題のプログラムはこんな感じで書いています。
今のところは問題はなさそう。

<?php
require_once './lib/Matomeyomi.php';

// DataBase
$dataBase->connectDb();

// Html
$html = null;

// 初期設定
$blogAll = [];
$blogWeekCount = [];
$blogAllCount = [];
$htmlArticleWeek = null;
$htmlArticleAll = null;
$htmlBlogWeek = null;
$htmlBlogAll = null;

// 初期読み込み
$sql = $dataBase->query("SELECT * FROM blog");
if($sql){
    while($Blog = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        $blogAll[$Blog['id']] = $Blog;
        $blogWeekCount[$Blog['id']] = $Blog['count'];
        $blogAllCount[$Blog['id']] = $Blog['count_all'];
    }
    
    // 記事ランキング
    $i = 1;
    $sql = $dataBase->query("SELECT id, blogid, title, count, count_all FROM article ORDER BY count DESC");
    while($Article = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        if(!$Article['count'])
        {
            break;
        }
        // 取得
        if(empty($blogWeekCount[$Article['blogid']]))
        {
            $blogWeekCount[$Article['blogid']] = 0;
        }
        $blogWeekCount[$Article['blogid']] += $Article['count'];
        if(empty($blogAllCount[$Article['blogid']]))
        {
            $blogAllCount[$Article['blogid']] = 0;
        }
        $blogAllCount[$Article['blogid']] += $Article['count_all'];
        // 表示
        if($i < 50)
        {
            if($htmlArticleWeek)
            {
                $htmlArticleWeek .= "<tr><th></th></tr>\n";
            }
            $htmlArticleWeek .= $config->rankArray('Article', $i, $Article['count'], $Article);
            $i++;
        }
    }
    if(!$htmlArticleWeek)
    {
        $htmlArticleWeek = "<tr><th>データがありません</th></tr>\n";
    }
    
    // 人気記事
    $i = 1;
    $sql = $dataBase->query("SELECT id, blogid, title, count_all FROM article ORDER BY count_all DESC");
    while($Article = $sql->fetch(\PDO::FETCH_ASSOC))
    {
        if(!$Article['count_all'])
        {
            break;
        }
        // 表示
        if($i < 50)
        {
            if($htmlArticleAll)
            {
                $htmlArticleAll .= "<tr><th></th></tr>\n";
            }
            $htmlArticleAll .= $config->rankArray('Article', $i, $Article['count_all'], $Article);
            $i++;
        }else{
            break;
        }
    }
    if(!$htmlArticleAll)
    {
        $htmlArticleAll = "<tr><th>データがありません</th></tr>\n";
    }
    
    // ブログランキング
    if($blogWeekCount)
    {
        arsort($blogWeekCount);
        $i = 1;
        foreach($blogWeekCount as $blogId => $num)
        {
            if(!$num)
            {
                break;
            }
            $Blog = $blogAll[$blogId];
            if($Blog['status'] != 1)
            {
                continue;
            }
            if($i < 50)
            {
                if($htmlBlogWeek)
                {
                    $htmlBlogWeek .= "<tr><th></th></tr>\n";
                }
                $htmlBlogWeek .= $config->rankArray('Blog', $i, $num, $Blog);
                $i++;
            }else{
                break;
            }
        }
    }
    if(!$htmlBlogWeek)
    {
        $htmlBlogWeek = "<tr><th>データがありません</th></tr>\n";
    }
    
    // 人気ブログ
    if($blogAllCount)
    {
        arsort($blogAllCount);
        $i = 1;
        foreach($blogAllCount as $blogId => $num)
        {
            if(!$num)
            {
                break;
            }
            $Blog = $blogAll[$blogId];
            if($Blog['status'] != 1)
            {
                continue;
            }
            if($i < 50)
            {
                if($htmlBlogAll)
                {
                    $htmlBlogAll .= "<tr><th></th></tr>\n";
                }
                $htmlBlogAll .= $config->rankArray('Blog', $i, $num, $Blog);
                $i++;
            }else{
                break;
            }
        }
    }
    if(!$htmlBlogAll)
    {
        $htmlBlogAll = "<tr><th>データがありません</th></tr>\n";
    }
}else{
    $htmlArticleWeek = $htmlArticleAll = $htmlBlogWeek = $htmlBlogAll = "登録されていません";
}

$html = $config::readHtml('ranking.html');

// 置き換え
$html = str_replace('${htmlArticleWeek}', $htmlArticleWeek, $html);
$html = str_replace('${htmlArticleAll}', $htmlArticleAll, $html);
$html = str_replace('${htmlBlogWeek}', $htmlBlogWeek, $html);
$html = str_replace('${htmlBlogAll}', $htmlBlogAll, $html);

// Display
$display::setHtml($html);
$display->sub();

// アクセス解析
$config->access();

最後で置き換え。
これでHTML中の何処へでも入れ込むことができるようになってます。
「便利だけどこれでいいのか!」という気持ちはありますね。

やっぱり、まだまだ未熟者。

-Web制作

執筆者:


  1. 匿名 より:

    ・\PDO::FETCH_ASSOCを使っているところをDataBaseクラスのメソッドにすれば、PDOを使っていることを知らなくてよい

    ・$blog*** や $html*** もクラスに切り出して振る舞い(is_empty()やrender()など)を持たせるともっとすっきりしそう

    • Rei より:

      コメントありがとうございます!

      \PDO::FETCH_ASSOCも隠し、わかりやすくなりました。
      (例)
      while($Blog = $dataBase->fetch($sql))
      {

      }

      empty~とhtmlの出力も調整、わかりにくい原因となりそうなのがいろいろ取れてすっきりしました(^^)
      ありがとうございます!

Rei へ返信する コメントをキャンセル

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

関連記事

no image

[PHP]「Notice: Undefined variable」および「Notice: Undefined index」

Notice: Undefined variable: disp in C:\xampp\htdocs\mini4matome\link.php on line 17 RSSリーダー(まとめ読み)を作 …

[Meisyo]ソースコードから学ぶ試合の基礎設計1

ワンボタンで監督始点の高校野球の試合を楽しめる名将と呼ばれた者達。その試合中には、多くのアルゴリズムが活躍しています。 ここでは、試合の設計を理解することで強いチームを作る指針を記載しておきます。 ソ …

[Meisyo] ver 0.32 リリース情報と2020年4月以降の開発予定について

名将と呼ばれた者達をver 0.32にアップデートします。 更新概要 1・探索の追加 2・探索の追加に伴うゲームバランスの再調整 更新詳細 探索の追加 アイテムを発掘できる動的なゲームシステムを追加し …

(VPSでつくる) Pythonのバージョンを2.7.5から3.6.8にする

連載第四回目です。 CentOS7にインストールされているPythonのバージョンが2.7なので、バージョンアップをします。 そうしないとPythonのアプリが動きません。 なぜなら、Python2と …

2022年 プログラミング初心者におすすめのPCと備品

はじめに プログラミング始めてみたい(始めてる)けど、パソコン用意したいなあと思った時、ググってみるといろいろ情報がありすぎて困ったあなた。 PC・プログラミング歴20年以上私が見るに、アフィリエイト …