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 へ返信する コメントをキャンセル

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

関連記事

TensorFlowまで到達

ちょいちょい数式に詰まりながらも、DeeplearningのフレームワークTensorFlowの学習まで漕ぎ着けました。 一番困ったのは「説明無しで数式使うよ!」 マジやめてください・・・まあ勉強する …

ゲームアプリ運営の分析ノウハウ vol.2 新規登録者編

はじめに アプリ開発者によくある悩み・・・登録者がゲームを続けてくれません!!。 続けてくれないをより細かく言うと、(1)コンテンツを一通りプレイしてもらいたいのか、(2)毎日プレイしてほしいのかによ …

Flask-Babelを使って、Pythonアプリで多言語対応を行う

Pythonで多言語対応してみたいなーと思っていました。 思っていましたが、実際になかなか使うタイミングがない・・・。 今回自作ゲームでユーザー数の増加がみられ、かつ海外からのアクセスも複数確認できた …

ゲームデータで学ぶSQL(初級編)

近年のデータサイエンスブームをきっかけに「SQLを学びたい」と思った方へ。 そう思ったところで、壁になってくるのは実データの入手です。 私は職業としてデータサイエンス関連の業務に従事していますが、キレ …

「名将と呼ばれた者達」目標

目標 ・アクティブプレイヤー100人以上(2018年12月末) ・登録人数100人(2018年9月)→達成し次第サーバー変更(AWS?)#試合クソ重くてすみません!弱さーばなんです ・2018年8月公 …