カテゴリー別アーカイブ: PHP

htmlで複数のRSSをまとめて処理するとなると面倒なことになる件(自分メモ)


PHPやperlでは簡単にできることが静的HTMLから操作するとなると簡単ではない。
それでもjQueryを使うことで比較的簡単に動かすことができた。
(静的HTMLとは言ったものの実際は裏でAjaxを動かすので完全な静的ではないですが。。)

▼hoge.html(body内)

<div id="rss_data"></div>
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="get_rss.js"></script>

▼get_rss.js
※headに書く場合はfunction以外をonloadで記述

var parent_id = "rss_data"; // id="rss_data"にRSSを表示する場合
var search_msg_data;
var gets = new Array();
// RSSフィードを指定する
gets['ameblo'] = "http://rssblog.ameba.jp/xxxxxxx/rss.html";
gets['fc2'] = "http://xxxxxx.blogXX.fc2.com/?xml";
//gets['xxx'] = "http://~"; // 何個でも追加可能(高負荷注意)
for (id in gets){
$("#" + parent_id).html('<p class="loading">Now Loading...</p>');
$.ajax({
type: "GET",
url: "get_rss.php?url=" + encodeURI(gets[id]) + "&id=" + id,
success: function(msg){
search_msg_data = msg;
var get_json = eval("("+search_msg_data+")");
if(get_json.items == null){
$("#" + parent_id + " p.loading").remove();
$("#" + parent_id).append("<p>該当するデータは見つかりませんでした。</p>");
}
else{
var items = get_json["items"];
var search_html = "";
for(var key in items){
if(key == 1){
search_html += '<ol class="' + items&#91;key&#93;.id + '">';
}
search_html += '<li><a href="' + items&#91;key&#93;.link + '">' + items[key].title + '</a>';
search_html += ' (' + items[key].date + ')</li>';
}
$("#" + parent_id + " p.loading").remove();
$("#" + parent_id).append(search_html + "</ol>");
}
}
});
}

▼get_rss.php

<?php
$url = $_GET&#91;'url'&#93;;
$id = $_GET&#91;'id'&#93;;
@$contents = file_get_contents($url);
$contents = preg_replace("/<(/)?(&#91;^:&#93;+):(&#91;^>]+)>/","<$1$2_$3>",$contents);
$xml = simplexml_load_string($contents);
$i=0;
foreach ($xml->item as $item){
$i++;
$array_data[strval($i)] = array(
"id" => $id,
"title" => strval($item->title),
"link" => strval($item->link),
"date" => strval($item->dc_date)
);
}
$array_all = array( "items" => $array_data);
print json_encode($array_all); // JSON出力
?>

PHPで複数のRSSフィードをまとめて処理する(自分メモ)


RSSフィードは項目の共通化が進んでいるので、
連想配列でループするだけで問題なく表示されることが多いみたい。

<?php
$rss = array(
'ameblo' => 'http://rssblog.ameba.jp/ユーザID/rss.html',
'fc2' => 'http://ユーザID.blogXXX.fc2.com/?xml'
);
foreach($rss as $key => $url){
@$contents = file_get_contents($url);
$contents = preg_replace("/<(/)?(&#91;^:&#93;+):(&#91;^>]+)>/","<$1$2_$3>",$contents);
$xml = simplexml_load_string($contents);
print <<< DOC_END
<ol class="{$key}">
DOC_END;
foreach ($xml->item as $item){
$title = strval($item->title);
$link = strval($item->link);
$date = strval($item->dc_date);
$date = preg_replace("/T([0-9:]+)+09:00/"," $1",$date);
print <<< DOC_END
<li><a href="{$link}">{$title}</a> ({$date})</li>
DOC_END;
}
print <<< DOC_END
</ol>
DOC_END;
}
?>

AjaxでMySQLからデータを取得してhtmlに反映するjQueryを使った簡単サンプル(自分メモ)


①PHPが動作する、②PHPのDBモジュールが使える、③jQueryが使える
この3つの条件が揃っていれば、簡単にMySQLからhtml内にデータを呼ぶことができます。

もちろんMySQLが使える環境で、かつ呼び出されるhtmlとSQLの文字コードが同じことが大前提ですが。
一番いいのは、文字コードがUTF-8に揃っていることですかね。そう考えると条件多いな。。

デモ画面

▼hoge.html(body内)

<div id="search_data"></div>
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="hoge.js"></script>

▼hoge.js
※headに書く場合はfunction以外をonloadで記述

var search_msg_data;
$("#search_data").html('Now Loading...');
$.ajax({
type: "GET",
url: "hoge.php",
success: function(msg){
search_msg_data = msg;
setTimeout('search_json()', 1000); // タイムラグ表示(Now Loading確認用)
//search_json(); // すぐに表示
}
});
function search_json(){
var get_json = eval("("+search_msg_data+")");
if(get_json.results == null){
$("#search_data").html("該当するデータは見つかりませんでした。");
}
else{
var hash = get_json["results"];
var search_html = "";
for(var i in hash){
search_html += '<dt>' + hash[i].name + '</dt>';
search_html += '<dd>' + hash[i].address + '</dd>';
}
$("#search_data").html('<dl>' + search_html + '</dl>');
}
}

▼hoge.php

<?php
require_once("DB.php");
$seaver_name = $_SERVER&#91;'SERVER_NAME'&#93;;
if($seaver_name == "localhost"){ // ローカルドメイン指定(test.hoge.jp)
$dbUserPass = "root";
$dbHost = "localhost";	// ホスト名
$dbName = "データベース名";
}
else{
$dbUser = "ユーザー名";
$dbPass = "パスワード";
$dbUserPass = $dbUser . ":" . $dbPass;
$dbHost = "mysql.xxxxx.ne.jp";	// ホスト名
$dbName = "データベース名";
}
$dbType = "mysql";
$dbTable = "テーブル名";
// データベース接続
$db = DB::connect("$dbType://$dbUserPass@$dbHost/$dbName");
if (DB::isError($db)){ 
die($db->getDebugInfo());
}
// クエリ発行
$sql = "SET NAMES utf8"; // UTF8の場合
$result = $db->query($sql);
$sql = "SELECT * FROM `$dbTable` ORDER BY name LIMIT 0 , 100";
// SQL文発行
$result = $db->query($sql);
if (DB::isError($result)) {
die ($result->getDebugInfo());
}
$i=1;
while ($rs = $result->fetchRow(DB_FETCHMODE_ASSOC)){
// テーブルの中身がidとnameとaddressの場合
$array_data[strval($i)] = array(
"id" => $rs['id'],
"name" => $rs['name'],
"address" => $rs['address']
);
// htmlで出力する場合
//echo "{$rs['id']}:{$rs['name']}:{$rs['address']}<br>";
$i++;
}
$array_all = array( "results" => $array_data);
print json_encode($array_all); // JSON出力
@$result->free();
$db->disconnect();
?>