13.3. Searching and BrowsingExample 13-3 shows the searching and browsing search.1 script used in the winestore. The script browses wines by selecting a combination of a wine region name and a wine type. For example, the script can browse the Red wines from the Margaret River region. The user can also choose to browse All regions or All wine types. The browsing interface supports Previous and Next page functionality using embedded links, as well as direct access to any page in the results. The script is based on the browse( ) function discussed in Chapter 5, which is included here renamed as showWines( ). The showWines( ) function is customized for presenting wine details and has calls to the functions showVarieties( ) and showPricing( ) from the include.inc include file. It also has embedded links to add one or a dozen bottles of the displayed wine to the shopping cart using the cart.3 script discussed in Chapter 11. The body of the script checks if search criteria have been provided as GET method parameters. If they have, these are used as parameters to the query that retrieves wines. If GET method parameters aren't provided, the query is configured using any previous search criteria that have been saved as the session variables sessionRegionName and sessionWineType. In either case, the current search criteria are then saved in the session variables for future use. The query string itself is created using the setupQuery( ) function. After running the query and presenting the results with the showWines( ) function, two <select> lists containing the query parameters are presented using the selectDistinct( ) function. This function is part of the include.inc file discussed in Chapter 10, and the selectDistinct( ) function is discussed in detail in Chapter 5. The search.1 script in Example 13-3 is the final module in the online winestore application, and this section concludes our discussion of the application. Example 13-3. search.1 searches and browses wines in the winestore<?php // This is the script that allows the to search and // browse wines, and to select wines to add to their // shopping cart include 'include.inc'; set_error_handler("errorHandler"); // Show the user the wines that match their query // This is a modified version of the browse( ) function // from Chapter 5 function showWines($query, $connection, $offset, $scriptName, $browseString) { // Number of rows per page $ROWS = 12; // Run the query on the database through // the connection if (!($result = @ mysql_query ($query, $connection))) showerror( ); // Find out how many rows there are $rowsFound = @ mysql_num_rows($result); // Is there any data? if ($rowsFound != 0) { // Yes, there is data. // The "Previous" page begins at the current // offset LESS the number of ROWS per page $previousOffset = $offset - $ROWS; // The "Next" page begins at the current offset // PLUS the number of ROWS per page $nextOffset = $offset + $ROWS; // Seek to the current offset if (!@ mysql_data_seek($result, $offset)) showerror( ); // Output the header and start a table echo "<table border=\"0\">\n"; // Fetch one page of results (or less if on the // last page) for ( $rowCounter = 0; (($rowCounter < $ROWS) && ($row = @ mysql_fetch_array($result)) ); $rowCounter++) { echo "\n<tr>\n\t<td>" . $row["year"] . " " . $row["winery_name"] . " " . $row["wine_name"]; // Print the varieties for this wine echo showVarieties($connection, $row["wine_id"]); // Print out the pricing information echo "\n\t<br>"; showPricing($connection, $row["wine_id"]); echo "</td>"; // Show the single-bottle add to cart link echo "\n\t<td><a href=\"example.cart.3.php?" . "qty=1&wineId=" . $row["wine_id"] . "\">Add a bottle to the cart</a></td>"; // Show the dozen add to cart link echo "\n\t<td><a href=\"example.cart.3.php?" . "qty=12&wineId=" . $row["wine_id"] . "\">Add a dozen</a></td>"; echo "\n</tr>"; } // end for rows in the page // Finish the results table, and start a footer echo "\n</table>\n<br>\n"; // Show the row numbers that are being viewed echo ($offset + 1), "-", ($rowCounter + $offset), " of "; echo "$rowsFound wines found matching " . "your criteria\n<br>"; // Are there any previous pages? if ($offset > 0) // Yes, so create a previous link echo "<a href=\"" . $scriptName . "?offset=" . rawurlencode($previousOffset) . "&" . $browseString . "\">Previous</a> "; else // No, there is no previous page so don't // print a link echo "Previous "; // Output the page numbers as links // Count through the number of pages in the results for($x=0, $page=1; $x<$rowsFound; $x+=$ROWS, $page++) // Is this the current page? if ($x < $offset || $x > ($offset + $ROWS - 1)) // No, so print out a link echo "\n<a href=\"" . $scriptName . "?offset=" . rawurlencode($x) . "&" . $browseString . "\">" . $page . "</a> "; else // Yes, so don't print a link echo "\n" . $page . " "; // Are there any Next pages? if (($row != false) && ($rowsFound > $nextOffset)) // Yes, so create a next link echo "\n<a href=\"" . $scriptName . "?offset=" . rawurlencode($nextOffset), "&" . $browseString . "\">Next</a> "; else // No, there is no next page so don't // print a link echo "\nNext "; } // end if rowsFound != 0 else { echo "\n<br>No wines found matching your " . " criteria.\n"; } } function setupQuery($regionName, $wineType) { // Show the wines stocked at the winestore that match // the search criteria $query = "SELECT DISTINCT wi.winery_name, w.year, w.wine_name, w.wine_id FROM wine w, winery wi, inventory i, region r WHERE w.winery_id = wi.winery_id AND wi.region_id = r.region_id AND w.wine_id = i.wine_id"; // Add region_name restriction if they've // selected a search parameter if ($regionName != "All") $query .= " AND r.region_name = \"" . $regionName . "\"" . " AND r.region_id = wi.region_id"; // Add wine type restriction if they've selected // a search parameter if ($wineType != "All") $query .= " AND w.type = \"" . $wineType . "\""; // Add sorting criteria $query .= " ORDER BY wi.winery_name, " . "w.wine_name, w.year"; return ($query); } // --------- // Initialize the session session_start( ); // Process the search parameters. // If a regionName is passed as a GET parameter, // use it. Otherwise, load the session variable // from the last search. If there is no previous // search and no parameter, set search to "All" if (!empty($HTTP_GET_VARS["regionName"])) $regionName = clean($regionName, 30); elseif (session_is_registered("sessionRegionName")) $regionName = $sessionRegionName; else $regionName = "All"; // Load wineType, using the same approach as // regionName if (!empty($HTTP_GET_VARS["wineType"])) $wineType = clean($wineType, 20); elseif (session_is_registered("sessionWineType")) $wineType = $sessionWineType; else $wineType = "All"; // Load offset if (!empty($HTTP_GET_VARS["offset"])) $offset = clean($offset, 5); else $offset = 0; // Save the search criteria $sessionRegionName = $regionName; $sessionWineType = $wineType; // Register the search criteria if needed if (!session_is_registered("sessionRegionName")) { session_register("sessionRegionName"); session_register("sessionWineType"); } // Open a connection to the DBMS if (!($connection = @ mysql_pconnect($hostName, $username, $password))) showerror( ); if (!mysql_select_db($databaseName, $connection)) showerror( ); // Build the query using the search criteria $query = setupQuery($regionName, $wineType); // This is used to encode the search parameters // for embedding in links to other pages of results $browseString = "wineType=" . urlencode($wineType) . "&regionName=" . urlencode($regionName); $scriptName = "example.search.1.php"; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd"> <html> <head> <title>Hugh and Dave's Online Wines</title> </head> <body bgcolor="white"> <?php // Show the user login status showLogin( ); // Show the dollar and item total of the cart showCart($connection); // Show a meaningful heading that describes the // search criteria echo "<h1>" . $wineType . " wines"; if ($regionName == "All") echo " from all regions."; else echo " of the " . $regionName . " region."; echo "</h1>\n"; // Display any messages to the user showMessage( ); // Show the user their search showWines($query, $connection, $offset, $scriptName, $browseString); echo "<form action=\"example.cart.5.php\"" . " method=\"GET\">\n"; echo "<table>\n<tr>\n"; echo "\t<td>Choose a wine region:</td>\n\t<td>"; // Produce a select list of wine regions selectDistinct($connection, "region", "region_name", "regionName", "All", $regionName); echo "</td>\n</tr>\n<tr>\n"; echo "\t<td>Choose a wine type:</td>\n\t<td>"; // Produce a select list of wine types selectDistinct($connection, "wine", "type", "wineType", "All", $wineType); echo "</tr>\n</table>\n"; echo "<table>\n<tr>\n"; // Show the user the search screen button echo "\t<td><input type=\"submit\" " . "name=\"search\" value=\"Search\"></td>\n"; // Show the user the search screen button echo "\t<td><input type=\"submit\" " . "name=\"home\" value=\"Home\"></td>\n"; // If the cart has contents, offer the opportunity // to view the cart or empty the cart. if (session_is_registered("order_no")) { echo "\t<td><input type=\"submit\" " . "name=\"empty\" value=\"Empty Cart\"></td>\n"; echo "\t<td><input type=\"submit\" " . "name=\"view\" value=\"View Cart\"></td>\n"; } // Show the user either a login or logout button loginButtons( ); echo "\n</tr>\n</table>\n"; echo "</form>\n"; ?> <br><a href="http://validator.w3.org/check/referer"> <img src="http://www.w3.org/Icons/valid-html401" height="31" width="88" align="right" border="0" alt="Valid HTML 4.01!"></a> </body> </html> Copyright © 2003 O'Reilly & Associates. All rights reserved. |
|