Using Advanced Search
Specifying XML Results with an HTTP GET Request
This tutorial shows how to use the Finding API to perform complex searches. Specifically, you use PHP to write a keyword-based findItemsAdvanced GET request to search for eBay listings and display the results in three price ranges. You specify that the response to your call is formatted as XML, and that the browser displays the results in an HTML table.
If the links you present to users (after making these calls) include affiliate tracking information, as described in this tutorial, you can earn commissions from eBay. To get an affiliate tracking number, go to eBay Partner Network. For notes about the tutorial, please see Notes and Next Steps. For additional resources, please see Additional Resources.
When you complete the tutorial, you will have created an application that returns results like this:
The keyword "ipod" returns items in three bands (the three price ranges specified in the request) that map neatly to different types of Ipods at different price levels.
The first band, the cheapest price range, tends to capture accessories and Ipod nanos. The second band, the middle price range, tends to return mid-range Ipods. The third band tends to return top-drawer Ipods with generous storage capacity and special features.
If the three-price-range search were applied to a book search, an author's name might return items in a similar array: cheap editions in the first range, hardcovers in good condition in the second, and in the third collectible-quality items such as first editions and signed copies.
This kind of search can give a snapshot to market price patterns for items that can be grouped by keywords.
There are two main steps in this tutorial:
Step 1: Set up the findItemsAdvanced call
The code you write in this tutorial is included in the file FindItemsAdvanced.php, which is contained in PHP_SearchInterm_NV_XML.zip, along with the auxiliary files used by the application, which include display functions and the jQuery JavaScript library. The search returns live production data.
Prerequisites
- Please join the eBay Developers Program. Note the Production AppID that you receive when you join. It is required to make Shopping API calls. Substitute your Production AppID in this tutorial where the code says "MyAppID." Note that your Production AppID is not the same as your eBay user ID.
- Please install Apache HTTP Server.
- Please install PHP 5. PHP 5 includes the SimpleXML extension. The PHP sample file you download with this tutorial will be stored in the htdocs folder of your Apache 2.2 installation (such as C:\Program Files\Apache Software Foundation\Apache2.2\htdocs).
Step 1: Set up the findItemsAdvanced call
In this step, you put two folders and one file into your htdocs folder. You also create your main PHP file and add some text to create the HTML that will display in the browser of a user of this application.
- Copy two folders and one file to htdocs. After you download the complete code in PHP_SearchInterm_NV_XML.zip, copy the js and css folders to the htdocs folder of your Apache 2.2 installation (say, C:\Program Files\Apache Software Foundation\Apache2.2\htdocs).
- Create a file with the following text.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>findItemsAdvanced</title> <script src="./js/jQuery.js"></script> <script src="./js/jQueryUI/ui.tablesorter.js"></script> <script> $(document).ready(function() { $("table").tablesorter({ sortList:[[7,0],[4,0]], // upon screen load, sort by col 7, 4 ascending (0) debug: false, // if true, useful to debug Tablesorter issues headers: { 0: { sorter: false }, // col 0 = first = left most column - no sorting 5: { sorter: false }, 6: { sorter: false }, 7: { sorter: 'text'} // specify text sorter, otherwise mistakenly takes shortDate parser } }); }); </script> </head> <body> <link rel="stylesheet" href="./css/flora.all.css" type="text/css" media="screen" title="Flora (Default)"> <form action="FindItemsAdvanced.php" method="post"> <table cellpadding="2" border="0"> <tr> <th>Query</th> <th>Site to Search</th> <th>Max Price</th> <th>Items per range</th> <th>Debug</th> </tr> <tr> <td><input type="text" name="Query" value="ipod"></td> <td> <select name="GlobalID"> <option value="EBAY-AU">Australia - EBAY-AU - AUD</option> <option value="EBAY-ENCA">Canada (English) - EBAY-ENCA - CAD</option> <option value="EBAY-DE">Germany - EBAY-DE - EUR</option> <option value="EBAY-GB">United Kingdom - EBAY-GB - GBP</option> <option value="EBAY-US">United States - EBAY-US - USD</option> </select> </td> <td><input type="text" name="MaxPrice" value="500"></td> <td> <select name="ItemsPerRange"> <option value="1">1</option> <option value="2">2</option> <option selected value="3">3</option> <option value="4">4</option> <option value="5">5</option> </select> </td> <td> <select name="Debug"> <option value="1">true</option> <option selected value="0">false</option> </select> </td> </tr> <tr> <td colspan="2" align="center"><INPUT type="submit" name="submit" value="Search"> </td> </tr> </table> </form>
- Save as FindItemsAdvanced.php in the htdocs folder of your Apache 2.2 installation.
- Review the values you will use in your call. The following table contains the values you will use for your findItemsAdvanced call.
- Add the following PHP function to your code, directly after
</form>
. This function will construct your FindItemsAdvanced call. This is where you specify the values for the site, the response encoding, the type of query, the site ID, the maximum number of entries in the return, and the price ranges. - Add code to make the call
- Add code and a helper file to display the items returned.
- In FindItemsAdvanced.php, after the last line above (where
$endpoint
is set to a URL value), add the following code:Add the code that constructs the layout of the FindItemsAdvanced call and specifies the results to display.
// Load the call and capture the document returned by the Finding API $resp = simplexml_load_file($apicall); // Check to see if the response was loaded, else print an error // Probably best to split into two different tests, but have as one for brevity if ($resp && $resp->paginationOutput->totalEntries > 0) { $results .= 'Total items : ' . $resp->paginationOutput->totalEntries . "<br />"; $results .= '<table id="example" class="tablesorter" border="0" cellpadding="0" cellspacing="1">'; $results .= "<thead><tr><th /><th>Title</th><th>Price </th><th>Shipping </th><th>Total </th><th><!--Currency--></th><th>Time Left</th><th>End Time</th></tr></thead>"; // If the response was loaded, parse it and build links foreach($resp->searchResult->item as $item) { if ($item->galleryURL) { $picURL = $item->galleryURL; } else { $picURL = "http://pics.ebaystatic.com/aw/pics/express/icons/iconPlaceholder_96x96.gif"; } $link = $item->viewItemURL; $title = $item->title; $price = sprintf("%01.2f", $item->sellingStatus->convertedCurrentPrice); $ship = sprintf("%01.2f", $item->shippingInfo->shippingServiceCost); $total = sprintf("%01.2f", ((float)$item->sellingStatus->convertedCurrentPrice + (float)$item->shippingInfo->shippingServiceCost)); // Determine currency to display - so far only seen cases where priceCurr = shipCurr, but may be others $priceCurr = (string) $item->sellingStatus->convertedCurrentPrice['currencyId']; $shipCurr = (string) $item->shippingInfo->shippingServiceCost['currencyId']; if ($priceCurr == $shipCurr) { $curr = $priceCurr; } else { $curr = "$priceCurr / $shipCurr"; // potential case where price/ship currencies differ } $timeLeft = getPrettyTimeFromEbayTime($item->sellingStatus->timeLeft); $endTime = strtotime($item->listingInfo->endTime); // returns Epoch seconds $endTime = $item->listingInfo->endTime; $results .= "<tr><td><a href=\"$link\"><img src=\"$picURL\"></a></td><td><a href=\"$link\">$title</a></td>" . "<td>$price</td><td>$ship</td><td>$total</td><td>$curr</td><td>$timeLeft</td><td><nobr>$endTime</nobr></td></tr>"; } $results .= "</table>"; } // If there was no response, print an error else { $results = "<p><i><b>No items found<b></i></p>"; } $priceRangeMin = $priceRangeMax; // set up for next iteration } // foreach } // if ?> <?php echo $results;?> </body> </html>
- Add an auxiliary PHP file to improve display.
- Save the DisplayUtils.php file in the htdocs folder of your Apache 2.2 installation.
Standard Parameter | Sample Value | Description |
---|---|---|
appid | MyAppID | The appid you obtain by joining the eBay Developers Program. |
version | 537 | The API version that your application supports. |
siteid | 0 | The numeric value for the eBay site with the items you want information about. The site ID of the US site is 0. |
callname | findItemsAdvanced | The name of the call you are using. |
responseencoding | XML | Specifies an encoding format for the response. |
QueryKeywords | ipod | Search terms. |
ItemSort | BestMatch | |
IncludeSelector | SearchDetails | |
trackingpartnercode | 1 | Affiliate information.|
trackingid | 123 | Affiliate information. |
affiliateuserid | 456 | Affiliate information. |
Call-Specific Value | Sample Value | Description |
---|---|---|
QueryKeywords | ipod | Specifies a search string. |
MaxEntries | 6 | Integer that specifies maximum number of items to return. |
ItemSort | BestMatch | A value that sets the sort order of the results. |
ItemType | FixedPricedItem | Item filter based on type of listing. |
PriceMin.Value and PriceMax.Value | 0 and 500 | Defines the overall price range. |
<?php require_once('DisplayUtils.php'); // functions to aid with display of information error_reporting(E_ALL); // turn on all errors, warnings and notices for easier debugging $results = ''; if(isset($_POST['Query'])) { $endpoint = 'http://svcs.ebay.com/services/search/FindingService/v1'; // URL to call $responseEncoding = 'XML'; // Format of the response $safeQuery = urlencode (utf8_encode($_POST['Query'])); $site = $_POST['GlobalID']; $priceRangeMin = 0.0; $priceRangeMax = $_POST['MaxPrice']; $itemsPerRange = $_POST['ItemsPerRange']; $debug = (boolean) $_POST['Debug']; $rangeArr = array('Low-Range', 'Mid-Range', 'High-Range'); $priceRange = ($priceRangeMax - $priceRangeMin) / 3; // find price ranges for three tables $priceRangeMin = sprintf("%01.2f", 0.00); $priceRangeMax = $priceRangeMin; // needed for initial setup foreach ($rangeArr as $range) { $priceRangeMax = sprintf("%01.2f", ($priceRangeMin + $priceRange)); $results .= "<h2>$range : $priceRangeMin ~ $priceRangeMax</h2>"; // Construct the FindItems call $apicall = "$endpoint?OPERATION-NAME=findItemsAdvanced" . "&SERVICE-VERSION=1.0.0" . "&GLOBAL-ID=$site" . "&SECURITY-APPNAME=YOUR_APP_ID" . "&keywords=$safeQuery" . "&paginationInput.entriesPerPage=$itemsPerRange" . "&sortOrder=BestMatch" . "&itemFilter(0).name=ListingType" . "&itemFilter(0).value=FixedPrice" . "&itemFilter(1).name=MinPrice" . "&itemFilter(1).value=$priceRangeMin" . "&itemFilter(2).name=MaxPrice" . "&itemFilter(2).value=$priceRangeMax" . "&affiliate.networkId=9" // fill in your information in next 3 lines . "&affiliate.trackingId=1********0" . "&affiliate.customId=456" . "&RESPONSE-DATA-FORMAT=$responseEncoding"; if ($debug) { print "GET call = $apicall <br>"; // see GET request generated }
Step 2: Add code to load the call and display the response
In this step you:
As described in Step 1, the URL used for the Shopping API call in this tutorial is http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsAdvanced&SERVICE-VERSION=1.0.0&GLOBAL-ID=EBAY-AU&SECURITY-APPNAME=YOUR_APP_ID&keywords=ipod&paginationInput.entriesPerPage=3&sortOrder=BestMatch&itemFilter(0).name=ListingType&itemFilter(0).value=FixedPrice&itemFilter(1).name=MinPrice&itemFilter(1).value=0.00&itemFilter(2).name=MaxPrice&itemFilter(2).value=166.67&affiliate.networkId=9&affiliate.trackingId=1********0&affiliate.customId=456&RESPONSE-DATA-FORMAT=XML.
The responseencoding=XML
parameter specifies that the response data will be in XML format.
Create (or copy from the PHP_SearchInterm_NV_XML.zip file) a separate file named DisplayUtils.php. This file contains a pair of convenience functions that prettify the display of the results. The functions are not needed to make the FindItemsAdvanced call. The DisplayUtils.php file is "required" in FindItemsAdvanced.php merely to access the convenience functions.
<?php date_default_timezone_set('GMT'); function getPrettyTimeFromEbayTime($eBayTimeString){ // Input is of form 'PT12M25S' $matchAry = array(); // initialize array which will be filled in preg_match $pattern = "#P([0-9]{0,3}D)?T([0-9]?[0-9]H)?([0-9]?[0-9]M)?([0-9]?[0-9]S)#msiU"; preg_match($pattern, $eBayTimeString, $matchAry); $days = (int) $matchAry[1]; $hours = (int) $matchAry[2]; $min = (int) $matchAry[3]; // $matchAry[3] is of form 55M - cast to int $sec = (int) $matchAry[4]; $retnStr = ''; if ($days) { $retnStr .= "$days day" . pluralS($days); } if ($hours) { $retnStr .= " $hours hour" . pluralS($hours); } if ($min) { $retnStr .= " $min minute" . pluralS($min); } if ($sec) { $retnStr .= " $sec second" . pluralS($sec); } return $retnStr; } // function function pluralS($intIn) { // if $intIn > 1 return an 's', else return null string if ($intIn > 1) { return 's'; } else { return ''; } } // function ?>
Step 3: Run the code
The FindItemsAdvanced.php file is complete. Open the file in a browser (http://localhost/FindItemsAdvanced.php).
The result should look similar to the following:
Congratulations! You have used the Shopping API to find items on eBay and to display the results to a user.
For information about the business benefits of using the eBay Developers Program and for other important information, please see the Quick Start Guide.
Notes and Next Steps
Try different input parameters to change the search criteria, or modify the application to display additional fields.
Exercise 1: Search for "Transformers."
Exercise 2: Add an Endtime filter.
eBay Partner Network (eBay Affiliate Program)
You may be able to earn money with the eBay Partner Network (eBay Affiliate Program). For more information, visit the eBay Partner Network. This tutorial contains affiliate-related code. The code is commented-out because affiliate functionality is not available in the Sandbox environment.
For information about the URL parameters for affiliate tracking, see the Affiliate URL Parameters and HTTP Header Values table.
Troubleshooting
If your code does not run, just use the FindItemsAdvanced.php file in PHP_SearchInterm_NV_XML.zip.
About the Application
The sample provided with this tutorial was built and tested on a Windows 2000 Server platform using PHP 5.2.1 for Win32 and Apache 2.2.4 for Windows.
About the Call
See findItemsAdvanced in the API Reference for descriptions of the input and output parameters and additional information.
Additional Resources
More information about the Finding API is available at these locations: