Hack 78 Program AWS with PHP

figs/expert.giffigs/hack78.gif

Parsing XML with the built-in PHP XML parser can be tricky. But once you see how it's done, you'll be parsing Amazon XML in no time.

Using someone else's wrapper functions to handle Amazon Web Services requests is a nice shortcut to building applications. But the time inevitably comes when you want to do something that existing wrappers don't handle. You can either look under the hood and tinker with or add to someone else's work, or you can build your own scripts from scratch.

The following bit of PHP might be a good start if you're building something from the ground up. It uses PHP's built-in XML parser to handle AWS responses, so there's nothing new to install. PHP's parser is James Clark's expat, and you can find the documentation at http://www.php.net/xml.

Given an ASIN, this example requests the lite XML response and formats the results in an HTML table.

78.1 The Code

This code builds an AsinSearch Amazon request URL with the asin value passed in through the querystring, and retrieves the XML with the fopen( ) function.

PHP's xml_parse_into_struct function turns the AWS response into two arrays?one with tag names ($index) and the other with values ($values). Looping through the array, the script then sets the value when it finds the XML tag it's looking for. With the values set, it prints the HTML to the page with the values in place. Create a file called ASINsearch.php containing the following code:

<?php
// Set Local variables
$dev_token = "insert developer token";
$aff_tag = "insert affiliate tag";
$asin = $_GET['asin']; //grab ASIN from Querystring
$xml = "";
$key = "";
$values = "";

// Set Amazon variables
$ProductName = "";
$ImageURL = "";
$OurPrice = "";
$AmazonURL = "";

// Build Amazon XML Query URL
$URL = "http://xml.amazon.com/onca/xml3?t=" . $aff_tag . 
       "&dev-t=" . $dev_token . 
       "&type=lite" . 
       "&f=xml" . 
       "&AsinSearch=" . $asin;

// Uncomment this line to see the URL
//print $URL;

// Get Amazon XML Query Results
$aurl=fopen($URL,"r");
while (!feof ($aurl))
    $xml .= fgets($aurl, 4096);
fclose ($aurl);

// Fire up the built-in XML parser
$parser = xml_parser_create(  ); 
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);

// Set tag names and values
xml_parse_into_struct($parser,$xml,$values,$index); 

// Close down XML parser
xml_parser_free($parser);

// Loop through the XML, setting values
foreach ($index as $key=>$val) {
    switch ($key) {
      case "ProductName":
          $ProductName = $values[$val[0]]['value'];
          break;
      case "ImageUrlMedium":
          $ImageURL = $values[$val[0]]['value'];
          break;
      case "OurPrice":
          $OurPrice = $values[$val[0]]['value'];
           break;
    }
}
?>
<table width="200" border="1" cellpadding="5" bgcolor="#cccccc">
<tr><td align="center">
<a href="http://www.amazon.com/o/ASIN/<?= $asin ?>/ref=nosim/<?= $aff_tag [RETURN]
?>">
    <img src="<?= $ImageURL ?>" border="0">
</a>
<br>
<?= $ProductName ?>
<br>
<b><?= $OurPrice ?></b>
</td></tr>
</table>

78.2 Running the Hack

Upload ASINsearch.php to your server and call it with an ASIN in the querystring:

http://your.server/ASINsearch.php?asin=insert ASIN

If all goes according to plan, you should see a nicely formatted table with the image of the product, its name, and the current Amazon price. The image should link to Amazon using your associate tag.