PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

19
PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML

Transcript of PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

Page 1: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

PHP with XML & AJAXXML: Extensible Markup Language

AJAX: Asynchronous JavaScript and XML

Page 2: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

XML

XML

XML is used to describe and to focus on what data is.

Describes the structure of the data

XML was designed to transport and store dataHTML was designed to display data

XML must be parsed into html

Page 3: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

Parsers

Expat: Event based parserViews XML as a series of events, when a

specific event occurs it will call a function

DOM: Tree based parserTransforms an xml document into a tree

structure, and provides access to tree elements

Page 4: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

1st, a little XML

<?xml version="1.0" encoding="ISO-8859-1"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>

Page 5: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

EXPAT

<?php//Initialize the XML parser$parser=xml_parser_create();

//Function to use at the start of an elementfunction start($parser,$element_name,$element_attrs)  {  switch($element_name)    {    case "NOTE":    echo "-- Note --<br />";    break;    case "TO":    echo "To: ";    break;    case "FROM":    echo "From: ";    break;    case "HEADING":    echo "Heading: ";    break;    case "BODY":    echo "Message: ";    }  }

//Function to use at the end of an elementfunction stop($parser,$element_name)  {  echo "<br />";  }

//Function to use when finding character datafunction char($parser,$data)  {  echo $data;  }

//Specify element handlerxml_set_element_handler($parser,"start","stop");

//Specify data handlerxml_set_character_data_handler($parser,"char");

//Open XML file$fp=fopen("test.xml","r");

//Read datawhile ($data=fread($fp,4096))  {  xml_parse($parser,$data,feof($fp)) or   die (sprintf("XML Error: %s at line %d",   xml_error_string(xml_get_error_code($parser)),  xml_get_current_line_number($parser)));  }

//Free the XML parserxml_parser_free($parser);?>

Page 6: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

What it does…

Initialize the XML parser with the xml_parser_create() function Create functions to use with the different event handlers Add the xml_set_element_handler() function to specify which

function will be executed when the parser encounters the opening and closing tags

Add the xml_set_character_data_handler() function to specify which function will execute when the parser encounters character data

Parse the file "test.xml" with the xml_parse() function In case of an error, add  xml_error_string() function to convert an

XML error to a textual description Call the xml_parser_free() function to release the memory

allocated with the xml_parser_create() function

Page 7: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

DOM

<?php$xmlDoc = new DOMDocument();$xmlDoc->load("note.xml");print $xmlDoc->saveXML();foreach ($x->childNodes AS $item)  {  print $item->nodeName . " = " . $item->nodeValue . "<br />";  }?>

<?xml version="1.0" encoding="ISO-8859-1"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>

Page 8: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

Output

#text = to = Tove#text = from = Jani#text = heading = Reminder#text = body = Don't forget me this weekend!#text =

When XML generates, it often contains white-spaces between the nodes. The XML DOM parser treats these as ordinary elements, and if you are not aware of them, they sometimes cause problems.

Page 9: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

Simple XML

New with PHP 5Easy way of accessing XML element’s

attributesElements are converted and sorted in

arrays if there is more than one element on one level.

Attributes are stored in an array, index corresponds to name

Elements data is converted into strings.

Page 10: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

Example

<?xml version="1.0" encoding="ISO-8859-1"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>

<?php$xml = simplexml_load_file("test.xml");

echo $xml->getName() . "<br />";

foreach($xml->children() as $child)  {  echo $child->getName() . ": " . $child . "<br />";  }?>

noteto: Tovefrom: Janiheading: Reminderbody: Don't forget me this weekend!

Page 11: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

The AJAX Technique

Page 12: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

The JavaScript

<html><head><script type="text/javascript">function showHint(str){if (str.length==0)  {   document.getElementById("txtHint").innerHTML="";  return;  }if (window.XMLHttpRequest)  {// code for IE7+, Firefox, Chrome, Opera, Safari  xmlhttp=new XMLHttpRequest();  }else  {// code for IE6, IE5  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  }xmlhttp.onreadystatechange=function()  {  if (xmlhttp.readyState==4 && xmlhttp.status==200)    {    document.getElementById("txtHint").innerHTML=xmlhttp.responseText;    }  }xmlhttp.open("GET","gethint.php?q="+str,true);xmlhttp.send();}

</script></head<body>

<p><b>Start typing a name in the input field below:</b></p><form> First name: <input type="text" onkeyup="showHint(this.value)" size="20" /></form><p>Suggestions: <span id="txtHint"></span></p>

</body></html>

Page 13: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

PHP side

<?php// Fill up array with names$a[]="Anna";$a[]="Brittany";$a[]="Cinderella";$a[]="Diana";$a[]="Eva";$a[]="Fiona";$a[]="Gunda";$a[]="Hege";$a[]="Inga";$a[]="Johanna";$a[]="Kitty";$a[]="Linda";$a[]="Nina";$a[]="Ophelia";$a[]="Petunia";$a[]="Amanda";$a[]="Raquel";$a[]="Cindy";$a[]="Doris";$a[]="Eve";$a[]="Evita";$a[]="Sunniva";$a[]="Tove";$a[]="Unni";$a[]="Violet";$a[]="Liza";$a[]="Elizabeth";$a[]="Ellen";$a[]="Wenche";$a[]="Vicky";

//get the q parameter from URL$q=$_GET["q"];

//lookup all hints from array if length of q>0if (strlen($q) > 0)  {  $hint="";  for($i=0; $i<count($a); $i++)    {    if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q))))      {      if ($hint=="")        {        $hint=$a[$i];        }      else        {        $hint=$hint." , ".$a[$i];        }      }    }  }

// Set output to "no suggestion" if no hint were found// or to the correct valuesif ($hint == "")  {  $response="no suggestion";  }else  {  $response=$hint;  }

//output the responseecho $response;?>

Page 14: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

MySQL and AJAX

<html><head><script type="text/javascript">function showUser(str){if (str=="")  {  document.getElementById("txtHint").innerHTML="";  return;  } if (window.XMLHttpRequest)  {// code for IE7+, Firefox, Chrome, Opera, Safari  xmlhttp=new XMLHttpRequest();  }else  {// code for IE6, IE5  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  }xmlhttp.onreadystatechange=function()  {  if (xmlhttp.readyState==4 && xmlhttp.status==200)    {    document.getElementById("txtHint").innerHTML=xmlhttp.responseText;    }  }xmlhttp.open("GET","getuser.php?q="+str,true);xmlhttp.send();}</script></head>

• Check if a person is selected

• Create an XMLHttpRequest object

• Create the function to be executed when the server response is ready

• Send the request off to a file on the server

• Notice that a parameter (q) is added to the URL (with the content of the dropdown list)

Page 15: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

And then… PHP & MySQL

<?php$q=$_GET["q"];

$con = mysql_connect('localhost', 'peter', 'abc123');if (!$con)  {  die('Could not connect: ' . mysql_error());  }

mysql_select_db("ajax_demo", $con);

$sql="SELECT * FROM user WHERE id = '".$q."'";

$result = mysql_query($sql);

echo "<table border='1'><tr><th>Firstname</th><th>Lastname</th><th>Age</th><th>Hometown</th><th>Job</th></tr>";

while($row = mysql_fetch_array($result))  {  echo "<tr>";  echo "<td>" . $row['FirstName'] . "</td>";  echo "<td>" . $row['LastName'] . "</td>";  echo "<td>" . $row['Age'] . "</td>";  echo "<td>" . $row['Hometown'] . "</td>";  echo "<td>" . $row['Job'] . "</td>";  echo "</tr>";  }echo "</table>";

mysql_close($con);?>

• PHP opens a connection to a MySQL server

• The correct person is found

• An HTML table is created, filled with data, and sent back to the "txtHint" placeholder

Page 16: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

PHP & Reading from XML files

Same old Javascript <?php

$q=$_GET["q"];

$xmlDoc = new DOMDocument();$xmlDoc->load("cd_catalog.xml");

$x=$xmlDoc->getElementsByTagName('ARTIST');

for ($i=0; $i<=$x->length-1; $i++){//Process only element nodesif ($x->item($i)->nodeType==1)  {  if ($x->item($i)->childNodes->item(0)->nodeValue == $q)    {    $y=($x->item($i)->parentNode);    }  }}

$cd=($y->childNodes);

for ($i=0;$i<$cd->length;$i++){ //Process only element nodesif ($cd->item($i)->nodeType==1)  {  echo("<b>" . $cd->item($i)->nodeName . ":</b> ");  echo($cd->item($i)->childNodes->item(0)->nodeValue);  echo("<br />");  }}?>

• PHP creates an XML DOM object

• Find all <artist> elements that matches the name sent from the JavaScript

• Output the album information (send to the "txtHint" placeholder)

Page 17: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

Live Search - Links

<?php$xmlDoc=new DOMDocument();$xmlDoc->load("links.xml");

$x=$xmlDoc->getElementsByTagName('link');

//get the q parameter from URL$q=$_GET["q"];

//lookup all links from the xml file if length of q>0if (strlen($q)>0){$hint="";for($i=0; $i<($x->length); $i++)  {  $y=$x->item($i)->getElementsByTagName('title');  $z=$x->item($i)->getElementsByTagName('url');  if ($y->item(0)->nodeType==1)    {    //find a link matching the search text    if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q))      {      if ($hint=="")        {        $hint="<a href='" .         $z->item(0)->childNodes->item(0)->nodeValue .         "' target='_blank'>" .         $y->item(0)->childNodes->item(0)->nodeValue . "</a>";        }      else        {        $hint=$hint . "<br /><a href='" .         $z->item(0)->childNodes->item(0)->nodeValue .         "' target='_blank'>" .         $y->item(0)->childNodes->item(0)->nodeValue . "</a>";        }      }    }  }}

// Set output to "no suggestion" if no hint were found// or to the correct valuesif ($hint=="")  {  $response="no suggestion";  }else  {  $response=$hint;  }

//output the responseecho $response;?>

• Load an XML file into a new XML DOM object

• Loop through all <title> elements to find matches from the text sent from the JavaScript

• Sets the correct url and title in the "$response" variable. If more than one match is found, all matches are added to the variable

• If no matches are found, the $response variable is set to "no suggestion"

Page 18: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

RSS Feeds

<?php//get the q parameter from URL$q=$_GET["q"];

//find out which feed was selectedif($q=="Google")  {  $xml=("http://news.google.com/news?ned=us&topic=h&output=rss");  }elseif($q=="MSNBC")  {  $xml=("http://rss.msnbc.msn.com/id/3032091/device/rss/rss.xml");  }

$xmlDoc = new DOMDocument();$xmlDoc->load($xml);

//get elements from "<channel>"$channel=$xmlDoc->getElementsByTagName('channel')->item(0);$channel_title = $channel->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;$channel_link = $channel->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue;$channel_desc = $channel->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;

//output elements from "<channel>"echo("<p><a href='" . $channel_link  . "'>" . $channel_title . "</a>");echo("<br />");echo($channel_desc . "</p>");

//get and output "<item>" elements$x=$xmlDoc->getElementsByTagName('item');for ($i=0; $i<=2; $i++)  {  $item_title=$x->item($i)->getElementsByTagName('title')  ->item(0)->childNodes->item(0)->nodeValue;  $item_link=$x->item($i)->getElementsByTagName('link')  ->item(0)->childNodes->item(0)->nodeValue;  $item_desc=$x->item($i)->getElementsByTagName('description')  ->item(0)->childNodes->item(0)->nodeValue;

  echo ("<p><a href='" . $item_link  . "'>" . $item_title . "</a>");  echo ("<br />");  echo ($item_desc . "</p>");  }?>

• Load an XML file into a new XML DOM object

• Loop through all <title> elements to find matches from the text sent from the JavaScript

• Sets the correct url and title in the "$response" variable. If more than one match is found, all matches are added to the variable

• If no matches are found, the $response variable is set to "no suggestion"

Page 19: PHP with XML & AJAX XML: Extensible Markup Language AJAX: Asynchronous JavaScript and XML.

AJAX & Polling

<?php$vote = $_REQUEST['vote'];

//get content of textfile$filename = "poll_result.txt";$content = file($filename);

//put content in array$array = explode("||", $content[0]);$yes = $array[0];$no = $array[1];

if ($vote == 0)  {  $yes = $yes + 1;  }if ($vote == 1)  {  $no = $no + 1;  }

//insert votes to txt file$insertvote = $yes."||".$no;$fp = fopen($filename,"w");fputs($fp,$insertvote);fclose($fp);?>

<h2>Result:</h2><table><tr><td>Yes:</td><td><img src="poll.gif"width='<?php echo(100*round($yes/($no+$yes),2)); ?>'height='20'><?php echo(100*round($yes/($no+$yes),2)); ?>%</td></tr><tr><td>No:</td><td><img src="poll.gif"width='<?php echo(100*round($no/($no+$yes),2)); ?>'height='20'><?php echo(100*round($no/($no+$yes),2)); ?>%</td></tr></table>

• Get the content of the "poll_result.txt" file

• Put the content of the file in variables and add one to the selected variable

• Write the result to the "poll_result.txt" file

• Output a graphical representation of the poll result