RのWeb制作

Webサービス制作のための技術情報を。

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の出力も調整、わかりにくい原因となりそうなのがいろいろ取れてすっきりしました(^^)
      ありがとうございます!

comment

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

関連記事

no image

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

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

手書き数字診断士(機械学習)を作り始めました

Python(Flask)+機械学習の勉強がてら、「手書き数字診断士」を作っています。 元ネタは2chの中小企業診断士です。 「う~ん、これは中小企業!w」 やること 1・index.html  1. …

Google Driveを使ってXAMPP+CakePHPのドキュメントルートを共有する in Windows

どこでも同じように作業がしたい。 デスクトップでも、ノートでも。 無論、サーバー(XAMPP)も同じように動かしたいな ・・・ということで、Google Driveを使って環境を構築していきます。 今 …

no image

PHPのコーディング規則、PSRを学ぶ(1)

PHPはかなり自由に書けることが魅力なのですが「自由に書ける」=「独自化する」=「その人以外わからない」等式が成り立ってしまいます。 これは困った。 つまり、コーディング(コードの書き方)の一般的な規 …

[Python] 機械学習での変数選択自動化(SVRを例に)

今回、会社のコンペで255というとんでもない量の変数を扱うことになりました。 価格予想を行うコンペです。 今回のデータのおさらい データ量は1500程度。8:2で分けると検証データが300しかないすご …