PDA

View Full Version : Problem with RSS2: multiple rss in the same page


Triky
09-23-2010, 11:23 AM
Hello, I'm using this code:

http://www.vbulletin.com/forum/showthread.php?159044-HowTo-Display-your-latest-threads-on-an-external-page-using-an-RSS2-feed

If I try to use it twice, I get this error:

Fatal error: Cannot redeclare character_data() (previously declared in C:\Programmi\EasyPHP 3.0\www\**\**\**\a.php:25) in C:\Programmi\EasyPHP 3.0\www\**\**\**\b.php on line 53

Can you please help me? :)

Triky
09-26-2010, 11:19 PM
No one can help me?

kh99
09-27-2010, 12:39 AM
Each block like

function something()
{
...
...
}

defines a function and so only needs to (and only can) appear in the same code once. So, if you're using that code twice in the same php file, just leave out the function definition blocks the second time.

Triky
09-29-2010, 10:26 AM
Thank you, now it works! I have just one problem. In the second list, I get also the results of the first website. How can I solve this?

kh99
09-29-2010, 12:08 PM
You need to include

$rss2_output = '';

before you use the code the second time.

Varsh
01-22-2012, 06:00 PM
Aaah I've been looking for this, I'm also on the same lines as Triky was with duplicating the results, not sure how to solve it even though you said that I need to include the output before re-using the code again.

What I have so far is this:

<?php
$rss2_art_file = 'http://localhost:41648/forums/external.php?type=RSS2&forumids=8';
$rss2_games_file = 'http://localhost:41648/forums/external.php?type=RSS2&forumids=5';

$is_item = false;
$tag = '';
$title = '';
$description = '';
$link = '';
$date = '';
$author = '';

function character_data($parser, $data) {
global $is_item, $tag, $title, $description, $link, $date, $author;

if ($is_item) {
switch ($tag) {
case "TITLE":
$title .= $data;
break;
case "DESCRIPTION":
$description .= $data;
break;
case "LINK":
$link .= $data;
break;
case "PUBDATE":
$date .= $data;
break;
case "AUTHOR":
$author .= $data;
break;
}
}
}

function begin_element($parser, $name) {
global $is_item, $tag;

if ($is_item) {
$tag = $name;
} else if ($name == "ITEM") {
$is_item = true;
}
}

function end_element($parser, $name) {
global $is_item, $title, $description, $link, $date, $author, $rss2_art, $rss2_games;

if ($name == "ITEM") {
$rss2_art .= "<b><a href='" . trim($link) . "'>" . htmlspecialchars(trim($title)) . "</a></b> - " . htmlspecialchars(trim($date)) . "<br>";
$rss2_games .= "<b><a href='" . trim($link) . "'>" . htmlspecialchars(trim($title)) . "</a></b> - " . htmlspecialchars(trim($date)) . "<br>";
$title = "";
$description = "";
$link = "";
$date = "";
$author = "";
$is_item = false;
}
}

$parser = xml_parser_create();

xml_set_element_handler($parser, "begin_element", "end_element");
xml_set_character_data_handler($parser, "character_data");
$fp_art = fopen($rss2_art_file,"r");
$fp_games = fopen($rss2_games_file,"r");

while ($data = fread($fp_art, 4096)) {
xml_parse($parser, $data, feof($fp_art));
}
while ($data = fread($fp_games, 4096)) {
xml_parse($parser, $data, feof($fp_games));
}

fclose($fp_art);
fclose($fp_games);
xml_parser_free($parser);
?>


That is in a separate file required once into the page and have it echoed out, but like Triky had, I have a duplicate.

kh99
01-22-2012, 06:17 PM
Try this:


<?php
$rss2_art_file = 'http://localhost:41648/forums/external.php?type=RSS2&forumids=8';
$rss2_games_file = 'http://localhost:41648/forums/external.php?type=RSS2&forumids=5';

$is_item = false;
$tag = '';
$title = '';
$description = '';
$link = '';
$date = '';
$author = '';

function character_data($parser, $data) {
global $is_item, $tag, $title, $description, $link, $date, $author;

if ($is_item) {
switch ($tag) {
case "TITLE":
$title .= $data;
break;
case "DESCRIPTION":
$description .= $data;
break;
case "LINK":
$link .= $data;
break;
case "PUBDATE":
$date .= $data;
break;
case "AUTHOR":
$author .= $data;
break;
}
}
}

function begin_element($parser, $name) {
global $is_item, $tag;

if ($is_item) {
$tag = $name;
} else if ($name == "ITEM") {
$is_item = true;
}
}

function end_element($parser, $name) {
global $is_item, $title, $description, $link, $date, $author, $rss2_output;

if ($name == "ITEM") {
$rss2_output .= "<b><a href='" . trim($link) . "'>" . htmlspecialchars(trim($title)) . "</a></b> - " . htmlspecialchars(trim($date)) . "<br>";
$title = "";
$description = "";
$link = "";
$date = "";
$author = "";
$is_item = false;
}
}

$parser = xml_parser_create();

xml_set_element_handler($parser, "begin_element", "end_element");
xml_set_character_data_handler($parser, "character_data");
$fp_art = fopen($rss2_art_file,"r");
$fp_games = fopen($rss2_games_file,"r");

$rss2_output = '';
while ($data = fread($fp_art, 4096)) {
xml_parse($parser, $data, feof($fp_art));
}
$rss2_art = $rss2_output;
$rss2_output = '';
while ($data = fread($fp_games, 4096)) {
xml_parse($parser, $data, feof($fp_games));
}
$rss2_games = $rss2_output;

fclose($fp_art);
fclose($fp_games);
xml_parser_free($parser);
?>


It would be better to put the code in a function where you pass the file name and return the string, but this should work.