Author Topic: help!! mysql database can't read "" from my xml/rss parser  (Read 339 times)

0 Members and 1 Guest are viewing this topic.

Offline randomsaiTopic starter

  • Irregular
  • Posts: 18
    • View Profile
help!! mysql database can't read "" from my xml/rss parser
« on: March 02, 2010, 01:56:49 AM »
as the title says, mysql database cannot read any tags of my feed where there are quotations involved. the code will be shown below, BTW the url where the xml file is generated is from my database. this is my primary website http://www.newsday.co.tt/rss.xml:


Code: [Select]
<?PHP
HEADER('content-type: text/plain');
  $f=0;
// define hooks to rss_parser class as xml functions do not allow object methods as handlers.
FUNCTION rss_start_element($parser, $name, $attributes) {
  GLOBAL $rss;
  $rss->start_element($parser, $name, $attributes);
}
 
FUNCTION rss_end_element($parser, $name) {
  GLOBAL $rss;
  $rss->end_element($parser, $name);
}
 
FUNCTION rss_character_data($parser, $data) {
  GLOBAL $rss;
  $rss->character_data($parser, $data);
}
 
 
CLASS rss_parser {
 
// constructor. setup parser options and handlers.
FUNCTION rss_parser() {

   
  $this->error = '';
  $this->file = '';
 
  $this->channel = ARRAY();
  $this->data = '';
  $this->stack = ARRAY();
  $this->num_items = 0;
 
  $this->xml_parser = XML_PARSER_CREATE();
  XML_SET_ELEMENT_HANDLER($this->xml_parser, "rss_start_element", "rss_end_element");
  XML_SET_CHARACTER_DATA_HANDLER($this->xml_parser, "rss_character_data");
}

FUNCTION character_data($parser, $data) {
  IF (EMPTY($this->data)) $this->data = TRIM($data);
  ELSE $this->data .= ' '.TRIM($data);               
}
 
FUNCTION start_element($parser, $name, $attrs) {
  SWITCH($name) {
    CASE 'RSS':
      BREAK;
 
    CASE 'CHANNEL':
      BREAK;
 

    CASE 'ITEM':
      ARRAY_PUSH($this->stack, $name);
      ARRAY_PUSH($this->stack, $this->num_items); // push item index.
      $this->item[$this->num_items] = ARRAY();
      $this->num_items++;
      BREAK;
 
    CASE 'TEXTINPUT':
      ARRAY_PUSH($this->stack, $name);
      BREAK;
 
    DEFAULT:
      ARRAY_PUSH($this->stack, $name);
      BREAK;
 
  }   
}
 
FUNCTION end_element($parser, $name) {
  SWITCH ($name) {
    CASE 'RSS':
      BREAK;
 
    CASE 'CHANNEL':
      BREAK;
 
 
    CASE 'ITEM':
      ARRAY_POP($this->stack);
      ARRAY_POP($this->stack);
      BREAK;
 
    CASE 'TEXTINPUT':
      ARRAY_POP($this->stack);
      BREAK;
 
    DEFAULT: // child element.
      $element = (IMPLODE("']['",$this->stack));     
      EVAL("\$this->channel['$element']=\$this->data;"); // this does all the hard work.
      ARRAY_POP($this->stack);
      $this->data = '';
      BREAK;
     
  }
}
 


FUNCTION parse() {

  IF (!($fp = @FOPEN($this->file, "r"))) {
    $this->error = "Could not open RSS source \"$this->file\".";
    RETURN FALSE;
  }
  WHILE ($data = FREAD($fp, 4096)) {
    IF (!XML_PARSE($this->xml_parser, $data, FEOF($fp))) {
      $this->error = SPRINTF("XML error: %s at line %d.",
        XML_ERROR_STRING(XML_GET_ERROR_CODE($this->xml_parser)),
        XML_GET_CURRENT_LINE_NUMBER($this->xml_parser));
      RETURN FALSE;
    }
  }
  XML_PARSER_FREE($this->xml_parser);
  RETURN TRUE;
}
 
}
$con1 = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("sources") or die(mysql_error());
$data = mysql_query("SELECT * FROM news")
or die(mysql_error());
mysql_close($con1);
while ($info = mysql_fetch_array( $data ))
{   
$url = $info['URL'];


   if ( @fopen( $url, 'r' ) )   
{   
$rss = NEW rss_parser();
$rss->file = "$url";
$rss->parse() or DIE($rss->error);
IF ($rss->error) PRINT $rss->error;
PRINT_R($rss->channel);
 
}

$i = 0;
do
{
$infoArray = $rss->channel;
$title = $infoArray['ITEM'][$i]['TITLE'];
$description = $infoArray['ITEM'][$i]['DESCRIPTION'];
$date = $infoArray['ITEM'][$i]['PUBDATE'];

$con = mysql_connect("localhost", "root", "");
mysql_select_db("info", $con);
mysql_query("INSERT INTO news (TITLE, DESCRIPTION, DATETIME) VALUES ('$title' , '$description' , '$date')");
mysql_close($con); 
$i++;
}
while($i<=9);
 
 }

?>
« Last Edit: March 04, 2010, 09:54:06 AM by fenway »

Offline thorpe

  • Administrator
  • 'Mind Boggling!'
  • *
  • Posts: 29,255
    • View Profile
Re: help!! mysql database can't read "" from my xml/rss parser
« Reply #1 on: March 02, 2010, 08:30:09 PM »
You need to escape data going into a database. Take a look at mysql_real_escape_string().

ps: You should also look at [code][/code] tags next time you post.

Offline randomsaiTopic starter

  • Irregular
  • Posts: 18
    • View Profile
Re: help!! mysql database can't read "" from my xml/rss parser
« Reply #2 on: March 03, 2010, 03:09:02 AM »
ok thanks, will try