こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

functionについて

こんばんは。お世話になっております。
自分の勉強不足を披露してしまうようでお恥ずかしいのですが、レッツPHPさんの「新着ブロガー」 http://php.s3.to/net/#rss を1件のみの表示とするよう設定し、検索結果として自分のソース内にあるwhileの中に、include("./rss/rssup.php"); と記載しているのですが、検索結果を実行させたとき、レッツPHPさんの「rssup.php」ソース内の、

// 日付ソート関数
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;
}//※※

※印のところでエラーが表示されてしまいます。
先にも申したように、自分の知識のなさを告知するようで大変お恥ずかしいとは思いながらも、調べていても解決する事が出来ず、あえて投函させていただきました。
お忙しい中恐縮ですが、アドバイスなど頂戴出来たら幸いです。
宜しくお願い致します。

投稿日時 - 2007-01-14 22:35:32

QNo.2666616

すぐに回答ほしいです

質問者が選んだベストアンサー

>検索し、検索一覧を表示させる際、DBに登録されたURLを基にrssup.phpによって、そのURLに記載のある最新記事を取得したいと考えての設置でした。
includeをどうするかというより、もともとの新着ブロガーの方のプログラムの変更が必要かと思います。取得もとのURLをDBから取り出すようにはなっていないですし、whileの中で複数回includeというか実行できたとしても、すべて同じ表示がでるだけでで希望の動作にはならないでしょう。

rssup.phpを以下のように変えて
-----------------------------------------------------------------
<?
//require "RSS.php";
//PEAR導入済みの場合↓
require "XML/RSS.php";

// サイト文字コード(SJIS、EUC-JPなど)
$code = "SJIS";

// 日付ソート関数
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;
}

function GetRss($rssurl)
{
// RSS取得・解析
$r =& new XML_RSS($rssurl);
if (PEAR::isError($r)) continue;
$r->parse();
if ($r->getChannelInfo()) $ch[$k] = $r->getChannelInfo();
$ch[$k]['items'] = $r->getItems();

usort($ch, "cmp");

// サイト名
$site_title = htmlspecialchars(mb_convert_encoding($ch[0]['title'], $code, "UTF-8,EUC-JP,SJIS"));
// サイトURL
$site_link = $ch[0]['link'];

// 記事タイトル
$title = mb_convert_encoding(strip_tags($ch[0]['items'][0]['title']), $code, "UTF-8,EUC-JP,SJIS");
// 記事内容
$desc = mb_convert_encoding(strip_tags($ch[0]['items'][0]['description']), $code, "UTF-8,EUC-JP,SJIS");
// 記事URL
$link = htmlspecialchars($ch[0]['items'][0]['link']);
// 記事更新時間(UNIXタイム
$time = (isset($ch[$i]['items'][0]['pubdate'])) ? strtotime($ch[0]['items'][0]['pubdate']) : strtotime(str_replace("T", " ", substr($ch[$i]['items'][0]['dc:date'], 0, 19)));
// 記事更新日 http://php.net/date
$date = date("Y/m/d", $time);
// 表示
echo <<<B
<a href="{$site_link}" target="_new">{$site_title}</a> / <a href="{$link}" target="_new" title="{$desc}">{$title}</a>&nbsp;({$date})<br>
B;
}
?>
-----------------------------------------------------------------
include("./rss/rssup.php");をwhileの前に入れて、whileの中でincludeしていた部分に、
GetRss($rssurl);
をいれて、$rssurlにDBから取り出した取得元URLを入れてください。

投稿日時 - 2007-01-15 22:42:01

お礼

kirin_f様

お忙しい中、早速のお返事をいただき、またソースまでご提示いただき有難う御座います。

ここ2週間ほど、情けないかな、全く進展が見られない状況の中、自分自身にも歯がゆいところでしたが、kirin_f様からご提示いただいたソースにて、描いていた結果を得ることが出来ました!

言葉足らずなご挨拶で恐縮ですが、有難い気持ちで一杯です。本当に有難う御座いました!

投稿日時 - 2007-01-16 00:17:42

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

経験上、「Cannot redeclare ~」と出るときって、同じ名前の関数が複数あったり、
同じファイルを2度以上includeとかrequireしようとしているときにでるような気がします。
要するに同じ名前の関数名が複数あってはいけないのに、読み込もうとしているから「宣言できない」とでるわけです。

>自分のソース内にあるwhileの中に、include("./rss/rssup.php");
whileでまわる回数分、rssup.phpを読み込もうとしているので、それで同じ関数が複数回読み込まれてエラーが出ているのではないでしょうか。
include("./rss/rssup.php")ではなく、include_once("./rss/rssup.php")とかしてみたらどうですか。

投稿日時 - 2007-01-15 20:49:55

お礼

kirin_f様

はじめまして、こんばんは。
皆さま同様、ご親切なアドバイスに感謝いたします。

>include_once("./rss/rssup.php")とかしてみたらどうですか。

私の説明不足でしたが、whileの中に入れるというのも、その都度同じことをさせたいのです。イメージとしては、

検索し、検索一覧を表示させる際、DBに登録されたURLを基にrssup.phpによって、そのURLに記載のある最新記事を取得したいと考えての設置でした。
include_onceで行うと、一番最初の(検索)結果は実行されますが、2行目以降が実行されずに、includeとだけで設置している次第です。

ならばと、直接whileの中に、reeup.phpの内容を記述してみましたが、
Fatal error: Cannot redeclare class xml_rss in
と、なにやら宿命的とかいうエラーが出てしまいます。

お忙しい中恐縮ですが、引き続きアドバイスなど頂けたら幸いです。

投稿日時 - 2007-01-15 21:29:08

ANo.1

エラーが出た場合はエラー文にその原因が表示されます。
普通はそれを読むだけで解決に至ることが多いので英語だからと無視しないでちゃんと読むようにしましょう。
またエラーについて質問するときは必ずエラーの内容を書くようにしましょう。
例えば
Cannot redeclare cmp() (previously declared in~
なら関数の再宣言は出来ませんという意味で同じ名前の関数が宣言されたと言うことです。
whileの中にincludeを書いていると言うことですがそうするとループの回数だけrssup.phpが実行されます。実行だけなら問題ありませんが中に関数の宣言がされているとそれも複数回宣言されることになり上記のエラーが出ます。
ループの中でincludeする場合はinclude_once()を使うようにしましょう。
エラーの内容が違う場合は補足してください。

投稿日時 - 2007-01-15 09:13:35

お礼

php504さま

こんにちは。お世話になっております。
早速のご回答をありがとう御座います。エラーの件、以降気をつけます。

Fatal error: Cannot redeclare cmp() (previously declared in

php504様が仰るように、上記が今回のエラーですが、「宣言出来ない」といった意味までは理解していたのですが、質問の題名にあるようにfunctionを調べているうちに、知識不足から何処をどう変更すべき?と分からなくなってしまったのが現状です。

また、当初はinclude_once()で行ったところ、1度目だけ実行(後は実行されずエラーもない)される、といった状況だったため、includeで記述しているところでした。

勉強不足を痛感しておりますが、何をどうすれば良いのか分からずにおります。お忙しい中恐縮ですが、引き続きアドバイスなど頂戴できたら幸いです。宜しくお願い致します。

投稿日時 - 2007-01-15 13:10:43