Page 1 of 1

php xml feed

Posted: Mon Apr 05, 2010 6:11 pm
by a11c
hello all,

i have a php script that pulls xml feed from various websites. The script works fine when only using once per page. I would like to modify the coding to allow me to use the same script 2 times per page. here are my files and coding

when i call on the file i use

Code: Select all

<?php include ($_SERVER["DOCUMENT_ROOT"]."/rss/rss.php"); ?>
the other is

Code: Select all

<?php include ($_SERVER["DOCUMENT_ROOT"]."/rss/sidebarvideo.php"); ?>
now i have 2 php files, the php files look like this; the only difference is on line 4. one uses /rss/rsslist.txt & the other is /rss/video.txt

Code: Select all

<?php

$nr_news=15;
$rssfile=$_SERVER["DOCUMENT_ROOT"]."/rss/rsslist.txt";
$rssurls=file($rssfile);
$rand=rand(1,count($rssurls))-1;
$file = $rssurls[$rand];

$rss_channel = array();
$currently_writing = "";
$main = "";
$item_counter = 0;

function startElement($parser, $name, $attrs) {
   	global $rss_channel, $currently_writing, $main;
   	switch($name) {
   		case "RSS":
   		case "RDF:RDF":
   		case "ITEMS":
   			$currently_writing = "";
   			break;
   		case "CHANNEL":
   			$main = "CHANNEL";
   			break;
   		case "IMAGE":
   			$main = "IMAGE";
   			$rss_channel["IMAGE"] = array();
   			break;
   		case "ITEM":
   			$main = "ITEMS";
   			break;
   		default:
   			$currently_writing = $name;
   			break;
   	}
}

function endElement($parser, $name) {
   	global $rss_channel, $currently_writing, $item_counter;
   	$currently_writing = "";
   	if ($name == "ITEM") {
   		$item_counter++;
   	}
}

function characterData($parser, $data) {
	global $rss_channel, $currently_writing, $main, $item_counter;
	if ($currently_writing != "") {
		switch($main) {
			case "ITEMS":
				if (isset($rss_channel[$main][$item_counter][$currently_writing])) {
					$rss_channel[$main][$item_counter][$currently_writing] .= $data;
				} else {
					//print ("rss_channel[$main][$item_counter][$currently_writing] = $data<br>");
					$rss_channel[$main][$item_counter][$currently_writing] = $data;
				}
				break;
		}
	}
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
/*
if (!($fp = fopen($file, "r"))) {
	die("could not open XML input");
}

/*
while ($data = fread($fp, 4096)) {
	if (!xml_parse($xml_parser, $data, feof($fp))) {
		die(sprintf("XML error: %s at line %d",
					xml_error_string(xml_get_error_code($xml_parser)),
					xml_get_current_line_number($xml_parser)));
	}
}
*/
$data=curl_string($file);
xml_parse($xml_parser,$data);
xml_parser_free($xml_parser);

// putting in array
$news=array();
if (isset($rss_channel["ITEMS"])) 
{
	if (count($rss_channel["ITEMS"]) > 0) 
		for($i = 0;$i < count($rss_channel["ITEMS"]);$i++) $news[]=$rss_channel["ITEMS"][$i];
}
$c=0;
foreach($news as $key=>$val)
{
	if($c<$nr_news)
	{
		echo "<p align=left>";
		echo '<a href="'.$val['LINK'].'">'.$val['TITLE'].'</a> - '.$val['PUBDATE'].'<br>'.''.$val['DESCRIPTION'].'</font></p>';
	}
	$c++;
}


function curl_string ($url,$user_agent='Mozilla 5.0'){

       $ch = curl_init();

       curl_setopt ($ch, CURLOPT_URL, $url);
       curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
       curl_setopt ($ch, CURLOPT_HEADER, 0);
       curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
       curl_setopt ($ch, CURLOPT_TIMEOUT, 120);
       $result = curl_exec ($ch);
       curl_close($ch);
       return $result;
  
}

?>
now when i check the browser i get a fatal error.

Fatal error: Cannot redeclare startelement() (previously declared in /home1/bigmoney/public_html/sitename/rss/video.php:14) in /home1/bigmoney/public_html/sitename/rss/sidebarvideo.php on line 36


can anyone help me configure to allow both to work together. thanks for any help

Re: php xml feed

Posted: Mon Apr 05, 2010 7:00 pm
by lunarnet76
hu just a really quick'n'dirty solution : add if(!function_exists("functionName")) before all your functions :drunk:

Re: php xml feed

Posted: Mon Apr 05, 2010 10:11 pm
by a11c
can i ask why, i have only minimal experience with php

Re: php xml feed

Posted: Tue Apr 06, 2010 7:23 am
by lunarnet76
in fact you cannot have two time the same function in a script,
as you include 2 time the same file and that file contains a function it is included 2 times!
with function_exists you ensure that the function is written only once in the script,
is it clear? cause my explanation seam a bit confused lol

Re: php xml feed

Posted: Tue Apr 06, 2010 9:17 am
by a11c
so i should add

Code: Select all

if(!function_exists("functionName"))
to all functions. now will this fix my problem or is this just using php properly?

Re: php xml feed

Posted: Tue Apr 06, 2010 9:34 am
by lunarnet76
you should use the function_exists only before startelement and endelement,
this is not a proper way of coding, this is just to avoid errors and it will make your code working!
The proper way would be to remove the function from the file you are included, and to had them in the file that includes your two rss feeds

Re: php xml feed

Posted: Tue Apr 06, 2010 10:58 am
by AbraCadaver
Move ALL of your functions to a file called rss/functions.php and make sure they are removed from rss/rss.php and rss/sidebarvideo.php. Then at the top of those two files put:

Code: Select all

include_once($_SERVER["DOCUMENT_ROOT"]."/rss/functions.php");

Re: php xml feed

Posted: Tue Apr 06, 2010 6:48 pm
by a11c
i did everything as described and.....IT WORKS GREAT.

thanks for all the time and effort