さくらのレンタルサーバにPHPとMySQLで簡単なアンテナサイトを初心者が設置するまで 【2日目】

2日目

2日目は、1日目でできたページをDB保存、読込を取り入れたページに改修していきます。
なお、cronの設定については本記事では説明しません。

今回想定する環境

さくらのレンタルサーバ スタンダードプラン
PHPバージョン 5.6
MySQLバージョン 5.5
 InnoDB
 utf_general_ci
使用ライブラリ MagpieRSS

事前準備など

DBを用意する

パースしたRSSの保存先となるDBが新しく必要です。
もしさくらのレンタルサーバでWordpressを使用しているなどの理由から、
既にDBをいくらか作成しているなら新たに作成した方が良いです。

さくらのレンタルサーバはサーバコントロールからDBを新規作成できます。
アプリケーションの設定 → データベースの設定 → データベースの新規作成 を開き
各項目を指定してDBを作成します。

テーブルを作成する

DBを新規作成したら、次にテーブルを作成します。
1日目で触れた次の項目にIDを加えます。

  • サイトのタイトル
  • サイトのindexページリンク
  • 記事のタイトル
  • 記事のリンク
  • 投稿日
  • 内容

rust-antenna_ss2

ここではlinkをキーにして、記事のリンクが重複しているデータを排除するようにしています。

構築の流れ

想定する仕組み

処理の流れとしては、

  1. cronで定期的に新しいデータ取得
  2. ユーザがindex.phpを開く時にDBからデータ取得、表示する
  3. cronで定期的に古いデータ削除

今回はメンテナンス性を上げるために4ファイルに分離しました。それぞれの働きは次の通り。

crowrer.php

cronで定期的にデータを取得してDBに追加するスクリプト。

dbController.php

mysqlの操作をまとめたファイル。

cfg.php

共通して使用する文字列をまとめたファイル。

index.php

ブラウザに表示する部分を出力するファイル。

なお、これらだけだとデータの削除は行わないため、DBにデータが溜まっていくだけになります。
削除は別途cronで流すスクリプトを用意するなどして
メンテナンスすることになりますが、ここでは紹介しません。

ソースコード:crowrer.php
getMessage());
		exit;
	}
	
	/**
	 * RSSデータ取得
	 */
	echo $no;

	foreach ($rssUrl as $no => $rss_url) {
    	if ($rss_url != '') {
		    // URLからRSSを取得
		    $rss   = fetch_rss($rss_url);
    		if ($rss != NULL) {
				for ($i = 0; $i < count($rss -> items); $i++) {
					$rss -> items[$i]["site_title"] = $rss -> channel["title"];
					$rss -> items[$i]["site_link"] = $rss -> channel["link"];
    		    }
   	    		// itemsを格納
		    	$rssItemsArray[] = $rss->items;
        	}
    	}
	}
	
	/**
	 * RSSデータをDBへ追加
	 */
	$concatArray = array();
	if (is_array($rssItemsArray)) {
    	for($i = 0; $i < count($rssItemsArray); $i++){
		    $concatArray = array_merge($concatArray, $rssItemsArray[$i]); // 配列を統合する
		}

    	foreach ($concatArray as $no => $values) {
			// RSSの種類によって日付を取得
	        if($values['published']){
				$date = $values['published'];
			}elseif($values['created']){
				$date = $values['created'];
			}elseif($values['pubdate']){
				$date = $values['pubdate'];
			}elseif($values['dc']['date']){
				$date = $values['dc']['date'];
			}
			$date = date(
				"Y-m-d H:i:s", strtotime($date)
			);

	        /**
	         * フィルター
	         */
			// 現在時刻の取得
    	    $nowtime = date(
				"Y-m-d H:i:s",
				strtotime( "now" )
			);
        	if($date > $nowtime){ // 未来記事の排除
	        }elseif(preg_match("/AD/", $values["title"])){ // 広告記事の排除
    	    }elseif(preg_match("/PR/", $values["title"])){ // 広告記事の排除
        	}else{
        
            	// 値の定義
	            $title = $values["title"];
    	        $link = $values["link"];
        	    $site_title = $values["site_title"];
            	$site_link = $values["site_link"];
            	$description = $values["description"];

	            // 記事ごとに必要な項目を抽出
    	        $rssArray[] = array(
					$date,
					$title,
					$link,
					$site_title,
					$site_link,
					$description
				);
        	}
    	}

    	/**
    	 * ソート
    	 */
	    function cmp($a, $b) {
    	    if ($a[0] == $b[0]) return 0;
        	return ($a[0] > $b[0]) ? -1 : 1;
    	}
	    if($rssArray) {
			usort($rssArray, 'cmp');
		}
	    if(count($rssArray) > $num){
			$count = $num;
		}else{
			$count = count($rssArray);
		}

   		/**
   		 * 必要な件数分だけHTML整形
   		 */
    	for ($i = 0; $i < $count; $i++) {
    		$date = date("Y-m-d H:i:s",strtotime($rssArray[$i][0]));
    	    $title = $rssArray[$i][1];
    	    $link = $rssArray[$i][2];
    	    $site_title = $rssArray[$i][3];
    	    $site_link = $rssArray[$i][4];
    	    $datelink = "
$date"; $titlelink = "$title"; $description = $rssArray[$i][5]; $site_titlelink = "[$site_title]
"; // 格納 $stmt = $dbc -> prepare("insert into ".$db['table']." (title,link,site_title,site_link,date,description) values (?,?,?,?,?,?)"); $stmt -> execute( array( $title, $link, $site_title, $site_link, $date, $description ) ); } } /** * DBから切断 */ disconnect($dbc); ?>
ソースコード:dbController.php
 query($sql);
		$rss_data;
		$count = 0;
		foreach ($stmt -> fetchAll(PDO::FETCH_ASSOC) as $data) {
  			$date = date('Y年m月d日 G:i',strtotime($data['date']));
  			$title = ($data['title']);
  			$link = ($data['link']);
  			$site_title = ($data['site_title']);
  			$site_link = ($data['site_link']);
			$description = ($data['description']);

  			$rss_data[$count] = array(
    			$title,
        		$link,
	    		$site_title,
    			$site_link,
    			$date,
    			$description
        	);
        	
			$count++;
		}
  		return $rss_data;
	}
	
?>
ソースコード:cfg.php

ソースコード:index.php
getMessage());
		exit;
	}

	/**
	 * ページ出力部分
	 */
	$rss_data = getData($dbc);
	echo "
"; for ($i1 = 0; $i1 < count($siteUrl); $i1++) { // サイトタイトル echo "
"; echo "

".$siteTitle[$i1]."

\n"; // 記事 echo "
    \n"; for ($i2 = 0; $i2 < count($rss_data); $i2++) { if($siteUrl[$i1] === $rss_data[$i2][3]){ // サイトURLが同一ならecho // 各種代入 $title = $rss_data[$i2][0]; $link = $rss_data[$i2][1]; $site_title = $rss_data[$i2][2]; $site_link = $rss_data[$i2][3]; $date = $rss_data[$i2][4]; $description = $rss_data[$i2][5]; // 記事出力 echo "
  • ".$date.'
    '.$title.'

    '.mb_strimwidth($description, 0, 600, "...")."
  • \n"; } } echo "
\n"; echo "
"; } echo "
"; /** * DBから切断 */ disconnect($dbc); ?>