カテゴリー: PHP

  • 【PHP】XML_RSSで未来の記事を無視(スキップ)する方法【PEAR】

    ブログやニュースサイトなどで配信されるRSSフィードを利用すると、オリジナルのRSSリーダーを作ることができます。

    ただ、ブログなどでは、未来の日時を利用した記事が常に最上位に表示されていることもあります。

    こうしたブログのRSSフィードを利用すると、その未来の記事が常に最上位に来てしまい不都合が生じます。

    そこで、未来の記事を無視(スキップ)する処理が必要になります。この点、ネットで探したのですが見つからなかったので簡単なスクリプトを書いてみました。

    ちなみにベースとなるRSSの処理は、PEARのXML_RSSです。

    また、ベースとなるスクリプトは、レッツPHP!さんのスクリプトを利用させて頂いてます。

    <?php
    //PEAR導入済みの場合↓
    require "XML/RSS.php";
    
    // RSSサイトURL(複数可)
    $rdf[] = "http://rss.asahi.com/f/asahi_newsheadlines";#朝日
    $rdf[] = "http://rss.yomiuri.co.jp/rss/yol/topstories";#読売
    $rdf[] = "http://mainichi.pheedo.jp/f/mainichijp_flash";#毎日
    $rdf[] = "http://sankei.jp.msn.com/rss/news/points.xml";#産経
    
    // 記事表示件数
    $num = 4;
    
    // 出力文字コード
    $enc = "UTF-8";
    // 日付ソート関数
    function cmp ($a, $b) {
      $a = (isset($a['items'][0]['pubdate'])) ?
    strtotime($a['items'][0]['pubdate']) :
    strtotime(str_replace("T", " ", substr($a['items'][0]['dc:date'], 0, 19)));
    
        $b = (isset($b['items'][0]['pubdate'])) ?
    strtotime($b['items'][0]['pubdate']) :
    strtotime(str_replace("T", " ", substr($b['items'][0]['dc:date'], 0, 19)));
    
    if ($a == $b) return 0;
        return ($a > $b) ? -1 : 1;
    }
    // RSS取得・解析
    foreach ($rdf as $k=>$rssurl) {
        $r =& new XML_RSS($rssurl);
        if (PEAR::isError($r)) continue;
        $r->parse();
        if ($r->getChannelInfo()) $ch[$k] = $r->getChannelInfo();
        $ch[$k]['items'] = $r->getItems();
    }
    /**** 未来の記事を無視する処理start ****/ //現在時刻取得 
    $nowtime = time();
    for ($i=0; $i < $num; $i++) {
        // 記事更新時間取得
        $time = (isset($ch[$i]['items'][0]['pubdate'])) ?
        strtotime($ch[$i]['items'][0]['pubdate']) :
         strtotime(str_replace("T", " ", substr($ch[$i]['items'][0]['dc:date'], 0, 19)));
    
     //更新時間が未来の日時ならばその配列を削除
    
      if ($time > $nowtime) {
         array_shift($ch[$i]['items']);
      }
    }
    /******** 処理end ********/
    usort($ch, "cmp");

    上記処理でやっていることは単純です。

    記事の更新時間を取得して、それが未来の日時ならば、その配列を削除するだけです。

    もし、未来の記事が2つあるならば下のようにします。

    /******** 未来の記事を2つスキップする処理 ********/
    $nowtime = time();
    for ($i=0; $i<$num; $i++) {    
    // 記事更新時間
    $time = (isset($ch[$i]['items'][0]['pubdate'])) ?
    strtotime($ch[$i]['items'][0]['pubdate']) :
    strtotime(str_replace("T", " ", substr($ch[$i]['items'][0]['dc:date'], 0, 19)));
      if ($time > $nowtime) {
        array_shift($ch[$i]['items']);
     //未来の記事2つ用     $time = (isset($ch[$i]['items'][0]['pubdate'])) ?
        strtotime($ch[$i]['items'][0]['pubdate']) :
        strtotime(str_replace("T", " ", substr($ch[$i]['items'][0]['dc:date'], 0, 19)));
     //もう一度、配列を削除する     if ($time > $nowtime) {
            array_shift($ch[$i]['items']);
        }
      }
    }

    これもやっていることは単純です。一つ目で未来の記事だった場合に、配列を一つ削除しますが、更に、二つ目の記事の日時をチェックして、それが未来だった場合には、その配列をも削除するという処理です。if文の入れ子になっています。

    ちなみに、この部分を応用して再帰関数化すれば、未来の記事が10個でも20個でもシンプルなスクリプトで処理できるようになります。

  • 【書評】体系的に学ぶ 安全なWebアプリケーションの作り方

    『体系的に学ぶ 安全なWebアプリケーションの作り方』 徳丸浩(著)の書評です。

    良い点

    • WEBアプリへの攻撃を具体的に体験できる
    • ほぼすべての脆弱性とその対策を網羅
    • 実習環境とサンプルスクリプトを完備
    • 主にPHPで解説
    • 文章が読みやすく理解しやすい

    悪い点

    • 初心者には若干ハードルが高い

    総評

    WEBアプリケーションのセキュリティに関し、現時点で最高の本です。

    セキュリティに関するトピックを網羅していながら、詳細で具体的な解説が多く理解しやすくなっています。

    予め用意されている実習環境を構築することで、攻撃手法とその防御策を実際に体験し学習することができます。

    解説に用いられている言語は、9割ほどがPHPなのでPHP既習者には特にお勧めです。PHP未学習者は、その点に注意が必要です。

    もっともPHPなどの言語そのものの解説はないので、初心者ならばPHPの入門書を何冊か読んだ後にこの本を読むのがお勧めです。

    この本はセキュリティだけで450ページ以上あるので、PHP入門書でセキュリティの基礎を学んでおくと途中で挫折することなく最後まで読みきれると思います。

    体系的に学ぶ 安全なWebアプリケーションの作り方

  • 【書評】基礎からのMySQL

    基礎からのMySQL 西沢夢路(著)の書評です。

    良い点

    • 読みやすく丁寧な解説
    • MySQLを基礎から応用まで広くカバー
    • 図と表がわかりやすい
    • PHPの解説もあり実践的なアプリ作成

    悪い点

    • 2007年発行のため内容が少し古い

    総評

    MySQLとPHPの組み合わせの書籍は他にも多くありますが、その中でも上位に入るわかりやすさです。

    MySQLの基礎から応用の解説がメインとなっており、サンプルアプリ作成のため必要な範囲でPHPの基礎も解説しています。

    ちなみに、サンプルアプリはスレッド式(2ch風)掲示板の作成です。サンプルコード内の変数がどのように遷移していくかなど図を用いて詳しく解説されています。

    わかりやすさでは随一と言ってよいこの『基礎からのMySQL』ですが、細かいところで、良くない点もあります。

    一つは、PHPのmagic_quotes_gpcの機能を推奨していることです。magic_quotes_gpcとは、入力値に対して、自動でバックスラッシュを付加する自動エスケープ機能のことです。ただ、不完全なため現在では非推奨となっていて、設定はOFFにすることになっています。

    もう一つは、サンプルアプリの解説でデータベースのUPDATEに触れていないことが挙げられます。もっともPHPに関しては、サンプルアプリに必要なだけの解説という前提のため仕方ないのですが、いわゆるCRUDシステムという観点からはUPDATEも解説に加えれば良かったのにと思いました。

    CRUDシステムというのは、create,read,update,deleteというデータベース読み書きのための4つの働きのことを言います。create,read,deleteの3つは解説されているのですが、updateだけページ数の関係か外されています。

    気になったのは、この二つですが、これらを差し引いても全体としては、とても分かりやすく内容も濃いのでお勧めできる一冊といえます。

    PHP+MySQL初心者が基礎を学び、初めて挑戦する実践的なサンプルアプリ作成のための基本書としてお勧めできます。

    基礎からのMySQL

  • 【書評】プログラミングPHP 第2版 オライリー

    プログラミングPHP 第2版 オライリーの書評です。

    良い点

    • PHP生みの親による解説本
    • 解説のツボを押さえていて必要十分に詳しい
    • 読みやすくて分かりやすい
    • セキュリティの解説あり

    悪い点

    • 2007年の出版であり少し古い

    総評

    この本は、PHPの生みの親であるラスマス・ラードフ氏が共著者として名を連ねています。この一点をもって価値があると言えるでしょう。また、今秋始まる予定のPHP技術者認定上級試験の準拠本に採用されています。

    内容としては、PHPの基礎から高度なトピックまでを幅広く扱っています。

    全15章のうち、前半の8章までは文法の基礎に重点が置かれています。

    基礎知識を一歩踏み込んで解説しているので、文法書でありながらも興味をもって読むことができます。正規表現についての解説もわかりやすく理解が深まりました。

    後半の9章から15章までは、比較的高度なトピックになります。

    グラフィックス、PDF、XML、セキュリティ、PHPのテクニックと続きます。

    特に、セキュリティの章とテクニックの章のパフォーマンスチューニングは参考になります。

    グラフィックスやPDFなどは、必要になったときに集中して読むのが良さそうです。

    14章は特に高度な内容で、C言語を使ったPHPの拡張モジュール作成の解説をしています。この章は、他のPHP本ではほとんど扱っていないので、拡張モジュールの作成に興味のある人には特に役立つと思います。

    全体的に、解説のツボを押さえていて必要十分に詳しいので、PHP学習の早い段階で読むと学習効果がより上がると思います。

    プログラミングPHP 第2版

  • 【書評】初めてのPHP5 (オライリー)

    初めてのPHP5 David Sklar(著)、桑村 潤、 廣川 類(訳)の書評です。

    良い点

    • PHPの理解が深まる
    • サンプルコードが豊富
    • 疑問点がいくつか解消した
    • 扱っているトピックの範囲が広い

    悪い点

    • 原著が2004年出版と古い(本書は2006年刊)
    • 翻訳書であり、直訳気味のため読みづらい
    • コード内の文字列が英語のまま
    • セキュリティが不十分
    • 白黒の一色刷り

    総評

    今春はじまったPHP技術者認定初級試験の主教材に採用されたので、読んでみました。

    この本のタイトルは『初めてのPHP5』となっていますが、あまり初心者向きではありません。

    たしかに、扱っているのは基礎的なことも多いのですが、オライリー書籍のもつ専門書的な体裁が入門の敷居を高くしています。

    たとえば、使用されている文法用語が難しめだったりします。

    内容的には、基礎的な知識の理解が深まり、応用につながる一冊だと思います。

    たとえば、浮動小数点の比較や、多次元配列の取り出しなど、疑問に思っていた箇所が理解できました。

    一通りPHPの基本書を読んだら、この本に目を通してみると良いかもしれません。

    初めてのPHP5