SlideShare a Scribd company logo
Building a simple RSS News Aggregator
Intro - RSS news aggregator Is built using PHP, SQLite, and simple XML Use to  - plug into RSS news feeds from all    over the web - create a newscast that reflects your    needs and interest for your website  It updates itself automatically with latest stories every time viewing it
Intro - RSS Stand for RDF Site Summary Use to publish and distribute information about what’s new and interesting on a particular site at a particular time An RSS document typically contains a list of resources (URLs), marked up with descriptive metadata.
Example of RSS document <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <rdf:RDF xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot; xmlns=&quot;http://purl.org/rss/1.0/&quot;> <channel rdf:about=&quot;http://www.melonfire.com/&quot;>   <title>Trog</title>   <description>Well-written technical articles and tutorials on web technologies</description>   <link>http://www.melonfire.com/community/columns/trog/</link>   <items>    <rdf:Seq>     <li rdf:resource=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=100&quot; />     <li rdf:resource=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=71&quot; />
Cont’ <li rdf:resource=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=62&quot; />    </rdf:Seq>   </items> </channel> <item rdf:about=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=100&quot;>   <title>Building A PHP-Based Mail Client (part 1)</title>   <link>http://www.melonfire.com/community/columns/trog/article.php?id=100</link>   <description>Ever wondered how web-based mail clients work? Find out here.</description> </item> <item rdf:about=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=71&quot;>
Cont’ <title>Using PHP With XML (part 1)</title>   <link>http://www.melonfire.com/community/columns/trog/article.php?id=71</link>   <description>Use PHP's SAX parser to parse XML data and generate HTML pages.</description> </item> <item rdf:about=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=62&quot;>   <title>Access Granted</title>   <link>http://www.melonfire.com/community/columns/trog/article.php?id=62</link>   <description>Precisely control access to information with the SQLite grant tables.</description> </item> </rdf:RDF>
Cont’ An RDF file is split into clearly demarcated sections First, the document prolog, namespace declarations, and root element. Follow by <channel> block which contains general information on the channel <items> block contains a sequential list  of all the resources describe within the RDF document <item> block describe a single resource in greater detail.
Design A Simple Database CREATE TABLE rss ( id INTEGER NOT NULL PRIMARY KEY, title varchar (255) NOT NULL, url varchar (255) NOT NULL, count INTEGER NOT NULL ); INSERT INTO rss VALUES (1, ‘Slashdot’, ‘http://slashdot.org/slashdot.rdf’, 5); INSERT INTO rss VALUES (2, ‘Wired News’, ‘http://www.wired.com/news_drop/netcenter/netcenter.rdf’, 5); INSERTINTO rss VALUES (3, ‘Business News’, ‘http://www.npr.org/rss/rss.php?topicId=6’, 3); INSERT INTO rss VALUES (4, ‘Health News’, ‘http://news.bbc.co.uk/rss/newsonline_world_edition/health/rss091.xml’, 3); INSERT INTO rss VALUES (5, ‘Freshmeat’, ‘http://www.freshmeat.net/backend/fm-release.rdf’, 5)
Create User.php <?php // PHP 5 // include configuration file include( 'config.php' ); // open database file $handle  =  sqlite_open ( $db ) or die( 'ERROR: Unable to open database!' ); // generate and execute query $query  =  &quot;SELECT id, title, url, count FROM rss&quot; ; $result  =  sqlite_query ( $handle ,  $query ) or die( &quot;ERROR: $query. &quot; . sqlite_error_string ( sqlite_last_error ( $handle )));
Cont’ // if records present if ( sqlite_num_rows ( $result ) >  0 ) {      // iterate through resultset     // fetch and parse feed       while( $row  =  sqlite_fetch_object ( $result )) {          $xml  =  simplexml_load_file ( $row -> url );         echo  &quot;<h4>$row->title</h4>&quot; ;          // print descriptions          for ( $x  =  0 ;  $x  <  $row -> count ;  $x ++) {              // for RSS 0.91              if (isset( $xml -> channel -> item )) {                  $item  =  $xml -> channel -> item [ $x ];             }           
Cont’   // for RSS 1.0              elseif (isset( $xml -> item )) {                  $item  =  $xml -> item [ $x ];             }             echo  &quot;<a href=\&quot;$item->link\&quot;>$item->title</a><br />$item->description<p />&quot; ;         }         echo  &quot;<hr />&quot; ;          // reset variables          unset( $xml );         unset( $item );     } } // if no records present // display message
Cont’ else { ?>     <font size = '-1'>No feeds currently configured</font> <?php } // close connection sqlite_close ( $handle ); ?>
Cont’ First is to obtain a list of RSS feeds configured by the user from the SQLite database Therefore, a SQLite database handle is initialized, and a SQL SELECT query is executed A while() loop is used to iterate through the resulting records For each obtained URL, the simplexml_load_file() function is used to retrieve and read RSS feed.  A for() loop is executed and the appropriate number of <item> elements in the feed are parsed.  The path to access an <item> differs depending on the feed is RSS 0.91 or RSS 1.0 If the database is empty, error message will appear.
config.php config.php is included at the top of every script. It contains database access parameters: <?php // database details // always use a directory that cannot be accessed from the web $path  =  $_SERVER [ 'DOCUMENT_ROOT' ]. '/../' ; $db  =  $path . 'rss.db' ; ?>
admin.php <html> <head><basefont face = 'Arial'></head> <body> <h2>Feed Manager</h2> <h4>Current Feeds:</h4> <table border = '0' cellspacing = '10'> <?php // PHP 5 // include configuration file include( 'config.php' ); // open database file $handle  =  sqlite_open ( $db ) or die( 'ERROR: Unable to open database!' );
// generate and execute query $query  =  &quot;SELECT id, title, url, count FROM rss&quot; ; $result  =  sqlite_query ( $handle ,  $query ) or die( &quot;ERROR: $query. &quot; . sqlite_error_string ( sqlite_last_error ( $handle ))); // if records present if ( sqlite_num_rows ( $result ) >  0 ) {      // iterate through result set     // print article titles      while ( $row  =  sqlite_fetch_object ( $result )) {   ?>         <tr>         <td> <?php  echo  $row -> title ;  ?>  ( <?php  echo  $row -> count ;  ?> )</td>         <td><font size = '-2'><a href=&quot;delete.php?id= <?php  echo  $row -> id ;  ?> &quot;>delete</a></font></td>         </tr> Cont’
  <?php      } } // if there are no records present, display message else { ?>     <font size = '-1'>No feeds currently configured</font> <?php } // close connection sqlite_close ( $handle ); ?> Cont’
</table> <h4>Add New Feed:</h4> <form action = 'add.php' method = 'post'> <table border = '0' cellspacing = '5'> <tr>     <td>Title</td>     <td><input type = 'text' name = 'title'></td> </tr> <tr>     <td>Feed URL</td>     <td><input type = 'text' name = 'url'></td> </tr> <tr>     <td>Stories to display</td>     <td><input type = 'text' name = 'count' size = '2'></td> </tr> Cont’
Cont’ <tr>     <td colspan = '2' align = 'right'><input type = 'submit' name = 'submit' value = 'Add RSS Feed'></td> </tr> </table> </form> </body> </html>
Cont’ There are two section is this script: - The first half connects to the database and    prints a list of all the currently configured    news feeds with a “delete” link next to    each. - The second half contains a form for admin    to add a new feed, together with its      attributes. Once the form is submitted, the data gets POST-ed to scripts add.php which validates it and save it to the database.
add.php <html> <head><basefont face = 'Arial'></head> <body> <h2>Feed Manager</h2> <?php // PHP 5 if (isset( $_POST [ 'submit' ])) {      // check form input for errors          // check title      if ( trim ( $_POST [ 'title' ]) ==  '' ) {         die( 'ERROR: Please enter a title' );     }
Cont’   // check URL      if (( trim ( $_POST [ 'url' ]) ==  '' ) || ! ereg ( &quot;^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\._\?\,\'/\\\+&%\$#\=~\-])*$&quot; ,  $_POST [ 'url' ])) {         die( 'ERROR: Please enter a valid URL' );     }      // check story number      if (! is_numeric ( $_POST [ 'count' ])) {         die( 'ERROR: Please enter a valid story count' );     }      // include configuration file      include( 'config.php' );   // open database file      $handle  =  sqlite_open ( $db ) or die( 'ERROR: Unable to open database!' );
// generate and execute query      $query  =  &quot;INSERT INTO rss (title, url, count) VALUES ('&quot; . $_POST [ 'title' ]. &quot;', '&quot; . $_POST [ 'url' ]. &quot;', '&quot; . $_POST [ 'count' ]. &quot;')&quot; ;      $result  =  sqlite_query ( $handle ,  $query ) or die( &quot;ERROR: $query. &quot; . sqlite_error_string ( sqlite_last_error ( $handle )));      // close connection      sqlite_close ( $handle );      // print success message      echo  &quot;Item successfully added to the database! Click <a href = 'admin.php'>here</a> to return to the main page&quot; ; } else {     die( 'ERROR: Data not correctly submitted' ); } ?> </body> Cont’
Cont’ There are three tests in the script to ensure the data being saved doesn’t contain gibberish One checks for the presence of a descriptive title Another uses the is_numeric() function to verify that the value entered for the story count is a valid number The third uses the ereg() function to check the format of the URL.
delete.php <html> <head><basefont face = 'Arial'></head> <body> <h2>Feed Manager</h2> <?php // PHP 5 if (isset( $_GET [ 'id' ]) &&  is_numeric ( $_GET [ 'id' ])) {      // include configuration file      include( 'config.php' );           // open database file      $handle  =  sqlite_open ( $db ) or die( 'ERROR: Unable to open database!' );
// generate and execute query      $query  =  &quot;DELETE FROM rss WHERE id = '&quot; . $_GET [ 'id' ]. &quot;'&quot; ;      $result  =  sqlite_query ( $handle ,  $query ) or die( &quot;ERROR: $query. &quot; . sqlite_error_string ( sqlite_last_error ( $handle )));           // close connection      sqlite_close ( $handle );      // print success message      echo  &quot;Item successfully removed from the database! Click <a href = 'admin.php'>here</a> to return to the main page&quot; ; } else {     die( 'ERROR: Data not correctly submitted' ); } ?> </body> </html>   Cont’
Cont’ The record ID passed through the URL GET method is retrieved by delete.php A DELETE SQL query is used is delete.php to erase the corresponding record.

More Related Content

What's hot (20)

Inroduction to XSLT with PHP4
Inroduction to XSLT with PHP4
Stephan Schmidt
 
Php and MySQL
Php and MySQL
Tiji Thomas
 
Php with my sql
Php with my sql
husnara mohammad
 
Web Scraping with PHP
Web Scraping with PHP
Matthew Turland
 
07 Introduction to PHP #burningkeyboards
07 Introduction to PHP #burningkeyboards
Denis Ristic
 
Php Crash Course
Php Crash Course
mussawir20
 
Introducation to php for beginners
Introducation to php for beginners
musrath mohammad
 
Web Development Course: PHP lecture 1
Web Development Course: PHP lecture 1
Gheyath M. Othman
 
Php Training
Php Training
adfa
 
Learn php with PSK
Learn php with PSK
Prabhjot Singh Kainth
 
Introduction into Struts2 jQuery Grid Tags
Introduction into Struts2 jQuery Grid Tags
Johannes Geppert
 
PHP Basic
PHP Basic
Yoeung Vibol
 
PHP variables
PHP variables
Siddique Ibrahim
 
PHP Workshop Notes
PHP Workshop Notes
Pamela Fox
 
The Big Documentation Extravaganza
The Big Documentation Extravaganza
Stephan Schmidt
 
P H P Part I I, By Kian
P H P Part I I, By Kian
phelios
 
Php i basic chapter 3
Php i basic chapter 3
Muhamad Al Imran
 
Basic PHP
Basic PHP
Todd Barber
 
PHP「参照渡しできるよ」(君の考えている参照渡しと同じとは言ってない)
PHP「参照渡しできるよ」(君の考えている参照渡しと同じとは言ってない)
Kana Natsuno
 
XML Transformations With PHP
XML Transformations With PHP
Stephan Schmidt
 
Inroduction to XSLT with PHP4
Inroduction to XSLT with PHP4
Stephan Schmidt
 
07 Introduction to PHP #burningkeyboards
07 Introduction to PHP #burningkeyboards
Denis Ristic
 
Php Crash Course
Php Crash Course
mussawir20
 
Introducation to php for beginners
Introducation to php for beginners
musrath mohammad
 
Web Development Course: PHP lecture 1
Web Development Course: PHP lecture 1
Gheyath M. Othman
 
Php Training
Php Training
adfa
 
Introduction into Struts2 jQuery Grid Tags
Introduction into Struts2 jQuery Grid Tags
Johannes Geppert
 
PHP Workshop Notes
PHP Workshop Notes
Pamela Fox
 
The Big Documentation Extravaganza
The Big Documentation Extravaganza
Stephan Schmidt
 
P H P Part I I, By Kian
P H P Part I I, By Kian
phelios
 
PHP「参照渡しできるよ」(君の考えている参照渡しと同じとは言ってない)
PHP「参照渡しできるよ」(君の考えている参照渡しと同じとは言ってない)
Kana Natsuno
 
XML Transformations With PHP
XML Transformations With PHP
Stephan Schmidt
 

Viewers also liked (12)

SimpleXML In PHP 5
SimpleXML In PHP 5
Ron Pringle
 
When RSS Fails: Web Scraping with HTTP
When RSS Fails: Web Scraping with HTTP
Matthew Turland
 
Almost Scraping: Web Scraping without Programming
Almost Scraping: Web Scraping without Programming
Michelle Minkoff
 
Web Scraping With Python
Web Scraping With Python
Robert Dempsey
 
Scraping data from the web and documents
Scraping data from the web and documents
Tommy Tavenner
 
JamNeo news aggregator
JamNeo news aggregator
JamNeo
 
Web Scraping with Python
Web Scraping with Python
Paul Schreiber
 
Scraping the web with python
Scraping the web with python
Jose Manuel Ortega Candel
 
Web scraping in python
Web scraping in python
Viren Rajput
 
Social Media Mining - Chapter 3 (Network Measures)
Social Media Mining - Chapter 3 (Network Measures)
SocialMediaMining
 
Web scraping in python
Web scraping in python
Saurav Tomar
 
Web scraping com python
Web scraping com python
Matheus Fidelis
 
SimpleXML In PHP 5
SimpleXML In PHP 5
Ron Pringle
 
When RSS Fails: Web Scraping with HTTP
When RSS Fails: Web Scraping with HTTP
Matthew Turland
 
Almost Scraping: Web Scraping without Programming
Almost Scraping: Web Scraping without Programming
Michelle Minkoff
 
Web Scraping With Python
Web Scraping With Python
Robert Dempsey
 
Scraping data from the web and documents
Scraping data from the web and documents
Tommy Tavenner
 
JamNeo news aggregator
JamNeo news aggregator
JamNeo
 
Web Scraping with Python
Web Scraping with Python
Paul Schreiber
 
Web scraping in python
Web scraping in python
Viren Rajput
 
Social Media Mining - Chapter 3 (Network Measures)
Social Media Mining - Chapter 3 (Network Measures)
SocialMediaMining
 
Web scraping in python
Web scraping in python
Saurav Tomar
 
Ad

Similar to Php Rss (20)

Php Mysql Feedrss
Php Mysql Feedrss
RCS&RDS
 
Introduction To Lamp
Introduction To Lamp
Amzad Hossain
 
Creating an RSS feed
Creating an RSS feed
Karthikeyan Mkr
 
Web Developement Workshop (Oct 2009) Slides
Web Developement Workshop (Oct 2009) Slides
Manish Sinha
 
XML processing with perl
XML processing with perl
Joe Jiang
 
Html5
Html5
dotNETUserGroupDnipro
 
PHPTAL introduction
PHPTAL introduction
'"">
 
Php Basic Security
Php Basic Security
mussawir20
 
Plagger the duct tape of internet
Plagger the duct tape of internet
Tatsuhiko Miyagawa
 
Architecting Web Services
Architecting Web Services
Lorna Mitchell
 
Phpvsjsp
Phpvsjsp
guest5b4d24
 
Transforming Xml Data Into Html
Transforming Xml Data Into Html
Karthikeyan Mkr
 
Solr Presentation
Solr Presentation
Gaurav Verma
 
YQL Overview
YQL Overview
Jonathan LeBlanc
 
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
guest517f2f
 
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Pamela Fox
 
Agile Descriptions
Agile Descriptions
Tony Hammond
 
XMLT
XMLT
Kunal Gaind
 
merb.intro
merb.intro
pjb3
 
REST dojo Comet
REST dojo Comet
Carol McDonald
 
Php Mysql Feedrss
Php Mysql Feedrss
RCS&RDS
 
Introduction To Lamp
Introduction To Lamp
Amzad Hossain
 
Web Developement Workshop (Oct 2009) Slides
Web Developement Workshop (Oct 2009) Slides
Manish Sinha
 
XML processing with perl
XML processing with perl
Joe Jiang
 
PHPTAL introduction
PHPTAL introduction
'"">
 
Php Basic Security
Php Basic Security
mussawir20
 
Plagger the duct tape of internet
Plagger the duct tape of internet
Tatsuhiko Miyagawa
 
Architecting Web Services
Architecting Web Services
Lorna Mitchell
 
Transforming Xml Data Into Html
Transforming Xml Data Into Html
Karthikeyan Mkr
 
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
guest517f2f
 
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Pamela Fox
 
Agile Descriptions
Agile Descriptions
Tony Hammond
 
merb.intro
merb.intro
pjb3
 
Ad

More from mussawir20 (20)

Database Design Process
Database Design Process
mussawir20
 
Php Simple Xml
Php Simple Xml
mussawir20
 
Php String And Regular Expressions
Php String And Regular Expressions
mussawir20
 
Php Sq Lite
Php Sq Lite
mussawir20
 
Php Sessoins N Cookies
Php Sessoins N Cookies
mussawir20
 
Php Reusing Code And Writing Functions
Php Reusing Code And Writing Functions
mussawir20
 
Php Oop
Php Oop
mussawir20
 
Php My Sql
Php My Sql
mussawir20
 
Php File Operations
Php File Operations
mussawir20
 
Php Error Handling
Php Error Handling
mussawir20
 
Php Using Arrays
Php Using Arrays
mussawir20
 
Javascript Oop
Javascript Oop
mussawir20
 
Html
Html
mussawir20
 
Javascript
Javascript
mussawir20
 
Object Range
Object Range
mussawir20
 
Prototype Utility Methods(1)
Prototype Utility Methods(1)
mussawir20
 
Date
Date
mussawir20
 
Prototype js
Prototype js
mussawir20
 
Template
Template
mussawir20
 
Class
Class
mussawir20
 
Database Design Process
Database Design Process
mussawir20
 
Php Simple Xml
Php Simple Xml
mussawir20
 
Php String And Regular Expressions
Php String And Regular Expressions
mussawir20
 
Php Sessoins N Cookies
Php Sessoins N Cookies
mussawir20
 
Php Reusing Code And Writing Functions
Php Reusing Code And Writing Functions
mussawir20
 
Php File Operations
Php File Operations
mussawir20
 
Php Error Handling
Php Error Handling
mussawir20
 
Php Using Arrays
Php Using Arrays
mussawir20
 
Javascript Oop
Javascript Oop
mussawir20
 
Prototype Utility Methods(1)
Prototype Utility Methods(1)
mussawir20
 

Recently uploaded (20)

FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance
 
AudGram Review: Build Visually Appealing, AI-Enhanced Audiograms to Engage Yo...
AudGram Review: Build Visually Appealing, AI-Enhanced Audiograms to Engage Yo...
SOFTTECHHUB
 
Agentic AI: Beyond the Buzz- LangGraph Studio V2
Agentic AI: Beyond the Buzz- LangGraph Studio V2
Shashikant Jagtap
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Oracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI Professional
VICTOR MAESTRE RAMIREZ
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
 
Oracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI Foundations
VICTOR MAESTRE RAMIREZ
 
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Safe Software
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
Edge AI and Vision Alliance
 
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Alliance
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
FME for Good: Integrating Multiple Data Sources with APIs to Support Local Ch...
Safe Software
 
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance Seminar State of Passkeys.pptx
FIDO Alliance
 
AudGram Review: Build Visually Appealing, AI-Enhanced Audiograms to Engage Yo...
AudGram Review: Build Visually Appealing, AI-Enhanced Audiograms to Engage Yo...
SOFTTECHHUB
 
Agentic AI: Beyond the Buzz- LangGraph Studio V2
Agentic AI: Beyond the Buzz- LangGraph Studio V2
Shashikant Jagtap
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Crypto Super 500 - 14th Report - June2025.pdf
Crypto Super 500 - 14th Report - June2025.pdf
Stephen Perrenod
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Oracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI Professional
VICTOR MAESTRE RAMIREZ
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Integration of Utility Data into 3D BIM Models Using a 3D Solids Modeling Wor...
Safe Software
 
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
National Fuels Treatments Initiative: Building a Seamless Map of Hazardous Fu...
Safe Software
 
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
No-Code Workflows for CAD & 3D Data: Scaling AI-Driven Infrastructure
Safe Software
 
Oracle Cloud Infrastructure AI Foundations
Oracle Cloud Infrastructure AI Foundations
VICTOR MAESTRE RAMIREZ
 
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Floods in Valencia: Two FME-Powered Stories of Data Resilience
Safe Software
 
Data Validation and System Interoperability
Data Validation and System Interoperability
Safe Software
 
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
“From Enterprise to Makers: Driving Vision AI Innovation at the Extreme Edge,...
Edge AI and Vision Alliance
 
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Seminar: Authentication for a Billion Consumers - Amazon.pptx
FIDO Alliance
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 

Php Rss

  • 1. Building a simple RSS News Aggregator
  • 2. Intro - RSS news aggregator Is built using PHP, SQLite, and simple XML Use to - plug into RSS news feeds from all over the web - create a newscast that reflects your needs and interest for your website It updates itself automatically with latest stories every time viewing it
  • 3. Intro - RSS Stand for RDF Site Summary Use to publish and distribute information about what’s new and interesting on a particular site at a particular time An RSS document typically contains a list of resources (URLs), marked up with descriptive metadata.
  • 4. Example of RSS document <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <rdf:RDF xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot; xmlns=&quot;http://purl.org/rss/1.0/&quot;> <channel rdf:about=&quot;http://www.melonfire.com/&quot;>   <title>Trog</title>   <description>Well-written technical articles and tutorials on web technologies</description>   <link>http://www.melonfire.com/community/columns/trog/</link>   <items>    <rdf:Seq>     <li rdf:resource=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=100&quot; />     <li rdf:resource=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=71&quot; />
  • 5. Cont’ <li rdf:resource=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=62&quot; />    </rdf:Seq>   </items> </channel> <item rdf:about=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=100&quot;>   <title>Building A PHP-Based Mail Client (part 1)</title>   <link>http://www.melonfire.com/community/columns/trog/article.php?id=100</link>   <description>Ever wondered how web-based mail clients work? Find out here.</description> </item> <item rdf:about=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=71&quot;>
  • 6. Cont’ <title>Using PHP With XML (part 1)</title>   <link>http://www.melonfire.com/community/columns/trog/article.php?id=71</link>   <description>Use PHP's SAX parser to parse XML data and generate HTML pages.</description> </item> <item rdf:about=&quot;http://www.melonfire.com/community/columns/trog/article.php?id=62&quot;>   <title>Access Granted</title>   <link>http://www.melonfire.com/community/columns/trog/article.php?id=62</link>   <description>Precisely control access to information with the SQLite grant tables.</description> </item> </rdf:RDF>
  • 7. Cont’ An RDF file is split into clearly demarcated sections First, the document prolog, namespace declarations, and root element. Follow by <channel> block which contains general information on the channel <items> block contains a sequential list of all the resources describe within the RDF document <item> block describe a single resource in greater detail.
  • 8. Design A Simple Database CREATE TABLE rss ( id INTEGER NOT NULL PRIMARY KEY, title varchar (255) NOT NULL, url varchar (255) NOT NULL, count INTEGER NOT NULL ); INSERT INTO rss VALUES (1, ‘Slashdot’, ‘http://slashdot.org/slashdot.rdf’, 5); INSERT INTO rss VALUES (2, ‘Wired News’, ‘http://www.wired.com/news_drop/netcenter/netcenter.rdf’, 5); INSERTINTO rss VALUES (3, ‘Business News’, ‘http://www.npr.org/rss/rss.php?topicId=6’, 3); INSERT INTO rss VALUES (4, ‘Health News’, ‘http://news.bbc.co.uk/rss/newsonline_world_edition/health/rss091.xml’, 3); INSERT INTO rss VALUES (5, ‘Freshmeat’, ‘http://www.freshmeat.net/backend/fm-release.rdf’, 5)
  • 9. Create User.php <?php // PHP 5 // include configuration file include( 'config.php' ); // open database file $handle = sqlite_open ( $db ) or die( 'ERROR: Unable to open database!' ); // generate and execute query $query = &quot;SELECT id, title, url, count FROM rss&quot; ; $result = sqlite_query ( $handle , $query ) or die( &quot;ERROR: $query. &quot; . sqlite_error_string ( sqlite_last_error ( $handle )));
  • 10. Cont’ // if records present if ( sqlite_num_rows ( $result ) > 0 ) {      // iterate through resultset     // fetch and parse feed      while( $row = sqlite_fetch_object ( $result )) {          $xml = simplexml_load_file ( $row -> url );         echo &quot;<h4>$row->title</h4>&quot; ;          // print descriptions          for ( $x = 0 ; $x < $row -> count ; $x ++) {              // for RSS 0.91              if (isset( $xml -> channel -> item )) {                  $item = $xml -> channel -> item [ $x ];             }           
  • 11. Cont’   // for RSS 1.0              elseif (isset( $xml -> item )) {                  $item = $xml -> item [ $x ];             }             echo &quot;<a href=\&quot;$item->link\&quot;>$item->title</a><br />$item->description<p />&quot; ;         }         echo &quot;<hr />&quot; ;          // reset variables          unset( $xml );         unset( $item );     } } // if no records present // display message
  • 12. Cont’ else { ?>     <font size = '-1'>No feeds currently configured</font> <?php } // close connection sqlite_close ( $handle ); ?>
  • 13. Cont’ First is to obtain a list of RSS feeds configured by the user from the SQLite database Therefore, a SQLite database handle is initialized, and a SQL SELECT query is executed A while() loop is used to iterate through the resulting records For each obtained URL, the simplexml_load_file() function is used to retrieve and read RSS feed. A for() loop is executed and the appropriate number of <item> elements in the feed are parsed. The path to access an <item> differs depending on the feed is RSS 0.91 or RSS 1.0 If the database is empty, error message will appear.
  • 14. config.php config.php is included at the top of every script. It contains database access parameters: <?php // database details // always use a directory that cannot be accessed from the web $path = $_SERVER [ 'DOCUMENT_ROOT' ]. '/../' ; $db = $path . 'rss.db' ; ?>
  • 15. admin.php <html> <head><basefont face = 'Arial'></head> <body> <h2>Feed Manager</h2> <h4>Current Feeds:</h4> <table border = '0' cellspacing = '10'> <?php // PHP 5 // include configuration file include( 'config.php' ); // open database file $handle = sqlite_open ( $db ) or die( 'ERROR: Unable to open database!' );
  • 16. // generate and execute query $query = &quot;SELECT id, title, url, count FROM rss&quot; ; $result = sqlite_query ( $handle , $query ) or die( &quot;ERROR: $query. &quot; . sqlite_error_string ( sqlite_last_error ( $handle ))); // if records present if ( sqlite_num_rows ( $result ) > 0 ) {      // iterate through result set     // print article titles      while ( $row = sqlite_fetch_object ( $result )) {   ?>         <tr>         <td> <?php echo $row -> title ; ?> ( <?php echo $row -> count ; ?> )</td>         <td><font size = '-2'><a href=&quot;delete.php?id= <?php echo $row -> id ; ?> &quot;>delete</a></font></td>         </tr> Cont’
  • 17.   <?php      } } // if there are no records present, display message else { ?>     <font size = '-1'>No feeds currently configured</font> <?php } // close connection sqlite_close ( $handle ); ?> Cont’
  • 18. </table> <h4>Add New Feed:</h4> <form action = 'add.php' method = 'post'> <table border = '0' cellspacing = '5'> <tr>     <td>Title</td>     <td><input type = 'text' name = 'title'></td> </tr> <tr>     <td>Feed URL</td>     <td><input type = 'text' name = 'url'></td> </tr> <tr>     <td>Stories to display</td>     <td><input type = 'text' name = 'count' size = '2'></td> </tr> Cont’
  • 19. Cont’ <tr>     <td colspan = '2' align = 'right'><input type = 'submit' name = 'submit' value = 'Add RSS Feed'></td> </tr> </table> </form> </body> </html>
  • 20. Cont’ There are two section is this script: - The first half connects to the database and prints a list of all the currently configured news feeds with a “delete” link next to each. - The second half contains a form for admin to add a new feed, together with its attributes. Once the form is submitted, the data gets POST-ed to scripts add.php which validates it and save it to the database.
  • 21. add.php <html> <head><basefont face = 'Arial'></head> <body> <h2>Feed Manager</h2> <?php // PHP 5 if (isset( $_POST [ 'submit' ])) {      // check form input for errors          // check title      if ( trim ( $_POST [ 'title' ]) == '' ) {         die( 'ERROR: Please enter a title' );     }
  • 22. Cont’   // check URL      if (( trim ( $_POST [ 'url' ]) == '' ) || ! ereg ( &quot;^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\._\?\,\'/\\\+&%\$#\=~\-])*$&quot; , $_POST [ 'url' ])) {         die( 'ERROR: Please enter a valid URL' );     }      // check story number      if (! is_numeric ( $_POST [ 'count' ])) {         die( 'ERROR: Please enter a valid story count' );     }      // include configuration file      include( 'config.php' ); // open database file      $handle = sqlite_open ( $db ) or die( 'ERROR: Unable to open database!' );
  • 23. // generate and execute query      $query = &quot;INSERT INTO rss (title, url, count) VALUES ('&quot; . $_POST [ 'title' ]. &quot;', '&quot; . $_POST [ 'url' ]. &quot;', '&quot; . $_POST [ 'count' ]. &quot;')&quot; ;      $result = sqlite_query ( $handle , $query ) or die( &quot;ERROR: $query. &quot; . sqlite_error_string ( sqlite_last_error ( $handle )));      // close connection      sqlite_close ( $handle );      // print success message      echo &quot;Item successfully added to the database! Click <a href = 'admin.php'>here</a> to return to the main page&quot; ; } else {     die( 'ERROR: Data not correctly submitted' ); } ?> </body> Cont’
  • 24. Cont’ There are three tests in the script to ensure the data being saved doesn’t contain gibberish One checks for the presence of a descriptive title Another uses the is_numeric() function to verify that the value entered for the story count is a valid number The third uses the ereg() function to check the format of the URL.
  • 25. delete.php <html> <head><basefont face = 'Arial'></head> <body> <h2>Feed Manager</h2> <?php // PHP 5 if (isset( $_GET [ 'id' ]) && is_numeric ( $_GET [ 'id' ])) {      // include configuration file      include( 'config.php' );           // open database file      $handle = sqlite_open ( $db ) or die( 'ERROR: Unable to open database!' );
  • 26. // generate and execute query      $query = &quot;DELETE FROM rss WHERE id = '&quot; . $_GET [ 'id' ]. &quot;'&quot; ;      $result = sqlite_query ( $handle , $query ) or die( &quot;ERROR: $query. &quot; . sqlite_error_string ( sqlite_last_error ( $handle )));           // close connection      sqlite_close ( $handle );      // print success message      echo &quot;Item successfully removed from the database! Click <a href = 'admin.php'>here</a> to return to the main page&quot; ; } else {     die( 'ERROR: Data not correctly submitted' ); } ?> </body> </html> Cont’
  • 27. Cont’ The record ID passed through the URL GET method is retrieved by delete.php A DELETE SQL query is used is delete.php to erase the corresponding record.