Skip to content

Instantly share code, notes, and snippets.

@iGlitch
Created February 9, 2015 18:31
Show Gist options
  • Save iGlitch/2708642436b04deda34a to your computer and use it in GitHub Desktop.
Save iGlitch/2708642436b04deda34a to your computer and use it in GitHub Desktop.
UpdateRSS
<?php
/*
IndexUpdaterのRSSバージョンです。
サイトの更新記録などにお使いください。
RSS2.0対応のRSSファイルを更新と同時に作成します。
--enable-mbstringが入ってないとRSSファイルのUTF-8変換が出来ません
設置方法
空のファイル「new.txt」「index.xml」が無ければ作成します
本体といっしょにアップロードします
new.txt、index.xmlのパーミッション(実行権限)を606にします
使用するページでテーブル等を作成してから、<?include("update.php");?>を挿入します。
デザインは自由に変更してください。 そのページも*.phpじゃないと動きません
*/
/*---------設定-----------*/
$logmax = 10; // ログ記録最大行、RSS出力記事数
$viewmax = 3; // 表示件数
$descmax = 500; // 概要での制限文字バイト数
$logfile = "newrss.txt"; // ログファイル名
$pwd = "0123"; // 投稿パスワード(変更してください
// RSSに出力するサイト情報
$ch_title = "レッツPHP!";
$ch_link = "http://glitchery.jp";
$ch_desc = "PHPの色々なスクリプトを配布してます。掲示板・チャット・アクセス解析など";
/*------------------------*/
// 古いバージョンのPHPに対応させる
if (phpversion() < "4.1.0") {
$_SERVER = $HTTP_SERVER_VARS;
$_POST = $HTTP_POST_VARS;
}
// 最初にファイルを読み込み、配列に代入
$lines = file($logfile);
//ヘッダ表示
if($_SERVER['QUERY_STRING']){
echo "<html><body>";
//外部ファイルを使う場合
//include("header.html");
}
// ?に続く文字で各モードに分岐
switch ($_SERVER['QUERY_STRING']) {
// すべての新着情報表示
case 'all':
echo "<hr size=1><h2>すべての新着情報</h2><br><blockquote>";
// 配列の先頭から、配列の終わりまでループ
for($i = 0; $i < count($lines); $i++) {
// 配列の$i行目を「<>」で各変数に分解
list($update, $title, $link, $desc) = explode("<>", $lines[$i]);
// UNIXタイムを日にちにフォーマット
$update = date("Y/m/d", $update);
// HTMLに整形して表示
echo "■<a href='$link'>$title</a> ($update)<br>$desc<br>";
}
// 管理モードへのリンクを張る
echo "</blockquote><br><div align=right><a href='?adm'>管理</a></div>";
break;
// パス入力・投稿画面表示
case 'adm':
// POSTフォームからのパスを変数に代入
$pass = $_POST['pass'];
// パスが空でなく、パスが違う場合はエラーを表示
if (!empty($pass) && $pass !== $pwd) die("パスワードが違うよ");
echo "<table width=100%><tr><th bgcolor=ffed83>管理モード</font></th></tr></table>";
// パスが空の場合はパス入力フォーム表示
if (empty($pass)) {
echo <<<PASS
<P><center><h4>パスワードを入力して下さい</h4>
<form action="?adm" method=POST>
0123
<input type=password name=pass size=8>
<input type=submit value=" 認 証 "></form></center>
PASS;
}
// それ以外の場合は、投稿フォームを表示
else {
echo <<<FORM
<form action="?reg" method=POST><table width=400 align=center>
<tr><td colspan=2 align=center><h4>新着情報をいれてください。</h4></td></tr>
<tr><td>タイトル</td><td><input type=text name="title" size=50></td></tr>
<tr><td>U R L</td><td><input type=text name="link" size=50 value="http://"></td></tr>
<tr><td>概 要</td><td><textarea name="desc" cols=45 rows=3></textarea></td></tr>
<tr><td colspan=2 align=center><input type=submit value=" 更 新 "><input type=reset value="クリア">
</form></td></tr></table>
FORM;
}
break;
// ログ更新・RSS作成処理
case 'reg':
function sanitize($str) {
$str = str_replace(array("&","<",">","\""), array("&amp;","&lt;","&gt;","&quot;"), $str);
return $str;
}
// 余分なクォート文字を取り除く
if (get_magic_quotes_gpc()) {
$_POST = array_map("stripslashes", $_POST);
}
$post = array_map("sanitize", $_POST);
// 変数に入れ直す
$title = $post['title'];
$link = $post['link'];
$desc = $post['desc'];
// タイトルは必須にする
if(empty($title)) die("タイトルを入力してください");
// URLも必須にする
if (!eregi("^http://", $link)) die("URLを入力してください");
// 制限文字数チェック
if (strlen($desc) > $descmax) die("文字数をオーバーしています");
// 改行文字を\nに統一する
$desc = str_replace("\r\n", "\r", $desc);
$desc = str_replace("\r", "\n", $desc);
// \nを<br> に変換する
$desc = str_replace("\n", "<br> ", $desc);
// 新データを<>でつなげる。最後に改行
$new_item = time()."<>".$title."<>".$link."<>".$desc."<>\n";
// ログ配列の先頭に加える
array_unshift($lines, $new_item);
// 余分なログを削除
$output = array_slice($lines, 0, $logmax);
// ログを更新
$fp = fopen($logfile , "w"); //書き込みモードでオープン
flock($fp, LOCK_EX); //ファイルロック
fputs($fp, implode("", $output)); //配列を結合して書き込む
fclose($fp);
// RSSを作成
$rss = <<<RSS_HEAD
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>$ch_title</title>
<link>$ch_link</link>
<description>$ch_desc</description>
<language>ja</language>\n
RSS_HEAD;
// 配列を展開
foreach ($lines as $item) {
// 各変数に分割
list($update, $title, $link, $desc) = explode("<>", $item);
// UNIXタイムをRFC822形式の書式に変換
$pubdate = date("r", $update);
// 概要からタグを除去
$desc = strip_tags($desc);
// 変数$rssに追加していく
$rss .= <<<ITEM
<item>
<title>$title</title>
<link>$link</link>
<description>$desc</description>
<pubDate>$pubdate</pubDate>
</item>\n
ITEM;
}
$rss .= <<<RSS_FOOT
</channel>
</rss>
RSS_FOOT;
// UTF-8に変換
$rss = mb_convert_encoding($rss, "UTF-8", "SJIS");
// RSSファイルを作成
$fp = fopen("index.xml" , "w");
flock($fp, LOCK_EX);
fputs($fp, $rss);
fclose($fp);
echo " - 更新完了 - <hr size=1>";
// 最新の新着情報表示
default:
// ログ行数が表示件数に満たない場合は、ログ行数分表示
if (count($lines) < $viewmax) $viewmax = count($lines);
// 配列の先頭から、$viewmaxまで取り出す
for($i = 0; $i < $viewmax; $i++) {
// 配列の$i行目を「<>」で各変数に分解
list($update, $title, $link, $desc) = explode("<>", $lines[$i]);
// UNIXタイムを日にちにフォーマット
$update = date("Y/m/d", $update);
// HTMLに整形して表示
echo "■<a href='$link'>$title</a> ($update)<br>$desc<br>";
}
// すべての新着情報にリンクを張る
echo "<div align=right><a href='updaterss.php?all'>&gt;&gt;</a></div>";
}
// フッタ表示
if($_SERVER['QUERY_STRING']){
echo "<hr size=1><div align=right>- <a href=http://glitchery.jp>Updater RSS</a> -</div></body></html>";
//外部ファイルを使う場合
//include("foot.html");
exit;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment