Chris Pollett > Old Classes > PIC40 ( Print View ) Lecture Notes-PDF Spring '01 Ad: Enrollment info Course Info:
Practice Exams: PIC: |
HW6 Solutions Page<? if($State=="Save Itinerary"){SetCookies();} // // FileName: p40hw6file1.php (Travel Planner program) // Now with Advertisements // // Purpose: This file accesses the airtransportation database to allow // user to make a travel itinerary based on the flight // information stored in this database. // ?> <html> <head> <title>Travel Planner</title> <script language="javascript" type="text/javascript"> <? //check if we will do the ItinerarySaved page // if($State =="Save Itinerary") { ?> // // Load in Our Images for ItinerarySaved page // $Car0 = new Image; $Car0.src = "car0.gif"; $Car1 = new Image; $Car1.src = "car1.gif"; <? }//end ItinerarySaved Check //Intro check //Only need to output VerifyDate when could be on Intro page if(!$State || $State=="Main Menu" || $State=="Show Flights") { ?> // // Function: VerifyDate() // // Purpose: Checks that the date is in the correct format // // function VerifyDate() { var $DEPDATE=document.forms[1].DEPDATE.value; var $BadDate = false, $DateParts, $Part, $i; var $Month, $Day; //Split Date into parts make sure has three parts $DateParts = $DEPDATE.split("-"); if($DateParts.length != 3) {return BadDate();} //Make sure parts of date of correct length and consist //of numbers. if(!( $DateParts[0].length == 4 && $DateParts[1].length == 2 && $DateParts[2].length == 2)) {return BadDate();} for ($Part in $DateParts) { for($i=0; $i < $Part.length ; $i++) { if($Part.charAt($i)<'0' || $Part.charAt($i)> '9') {return BadDate();} } } $Month = parseInt($DateParts[1]); $Day = parseInt($DateParts[2]); if( ($Month == 2 && $Day >28) || (($Month == 4 || $Month == 6 || $Month == 9 || $Month == 11) && $Day >30) || $Day >31) {return BadDate();} return true; } function BadDate() { var $MSG = 'Date format should be YYYY-MM-DD\n'; $MSG += 'where Y=Year, M=Month, D=Day.\n'; $MSG += 'For example, 2001-08-01.\n'; $MSG += 'Make sure the day is correct for\n'; $MSG += 'the month as well. For example, Feb. has\n'; $MSG += '28 days.'; alert($MSG); return false; } <? } //end of Intro Check // Check again if will do ItinerarySaved page // if($State == "Save Itinerary") { ?> // // Function: GoToURL() // // Purpose: used by the select object on the ItinerarySaved // page to immediately jump to selected hotel // function GoToURL() { var $Hotels = document.forms[0].hotels; var $Hotel = $Hotels.options[$Hotels.selectedIndex].value; document.location.href = $Hotel; } // // Function: ChangeImage() // // Purpose: changes which car is display on the ItinerarySaved() // page // function ChangeImage($car) { document.car.src=$car.src; } <? }// End second ItinerarySaved check ?> </script> </head> <body bgcolor="#99FFCC"> <? // // Main Loop: // // $State variable is used to control which page is displayed switch($State) { case "Fetch Now": Itinerary("saved"); break; case "Save Itinerary": ItinerarySaved(); break; case "Show Flights": $MSG = CKAirport(); if($MSG == "Flight") {Flight();} else if($MSG != "done") {Intro($MSG);} break; case Previous: if($SEAT2) {Flight();} else {SelectSeat();} break; case Flight: Flight(); break; case "Continue": if($SEAT) {Itinerary("unsaved");} else {SelectSeat();} break; case "Main Menu": default: Intro(); } ?> </body> </html> <? // // Function: ItinerarySaved() // // Purpose: After the itinerary has been saved this page // provides the user with links to hotels // and car rental companies in the destination city // function ItinerarySaved() { GLOBAL $DESCITY; ?> <h3 style="color:blue">Itinerary Saved</h3> <h1>Now that you've chosen your trip may we suggest the following hotels...</h1> <hr> <form method="post" action="hw6.php"> <div style="text-align:center"> <table> <? if($DESCITY == "YFK") {?> <tr><td> <select name="hotels" onChange="GoToURL()" size="4"> <option value="http://www.centennialhotels.com/" selected="true"> Centenial Hotels Halifax </option> <option value="http://www.ramadans.com/"> Ramada Park Place </option> <option value="http://www.citadelhalifax.com/"> The Citadel Hotel </option> <option value="http://www.waverleyinn.com/"> The Waverley Inn </option> </select> </td></tr> <tr><td> <a href="http://www.halifax.worldweb.com/Rentals/CarTrucks/" onMouseover="ChangeImage($Car1); return true;" onMouseout="ChangeImage($Car0); return true;"> <img name="car" src="car0.gif" /> </a> </td></tr> <tr><td> <?} if($DESCITY == "BOS") {?> <tr><td> <select name="hotels" onChange="GoToURL()" size="4"> <option value="http://www.theinnatharvard.com" selected="true"> The Inn at Harvard </option> <option value="http://www.fshr.com/locations/Boston/"> Four Seasons </option> <option value= "http://www.MarriottHotels.com/dpp/PropertyPage.asp?MarshaCode=BOSLW"> The Marriot Long Wharf </option> <option value= "http://www.reservation-services.com/radissonhotelboston.html"> Radisson Hotel Downtown </option> </select> </td></tr> <tr><td> <a href="http://www.boston-bos.com/car_rental.html" onMouseover="ChangeImage($Car1); return true;" onMouseout="ChangeImage($Car0); return true;"> <img name="car" src="car0.gif" /> </a> </td></tr> <tr><td> <?} if($DESCITY == "LAX") {?> <tr><td> <select name="hotels" onChange="GoToURL()" size="4"> <option value="http://www.holidayinnlongbeach.com" selected="true"> Long Beach Holiday Inn </option> <option value="http://www.bestwesternhollywood.com"> Best Western Hollywood </option> <option value="http://www.daysinn-maingate.com"> Days Inn Anaheim </option> <option value="http://www.esanaheim.com"> Embassy Suites Anaheim </option> </select> </td></tr> <tr><td> <a href="http://www.la-rentacar.com/" onMouseover="ChangeImage($Car1); return true;" onMouseout="ChangeImage($Car0); return true;"> <img name="car" src="car0.gif" /> </a> </td></tr> <tr><td> <?} if($DESCITY == "CDG" || $DESCITY == "ORY" ) {?> <tr><td> <select name="hotels" onChange="GoToURL()" size="4"> <option value="http://www.ritz.com/" selected="true"> The Ritz Paris </option> <option value="http://www.fourseasons.com/locations/Paris/index.php"> Hotel George V </option> <option value="http://www.sofitel.mgn.fr/"> Sofitel </option> <option value="http://www.hotels-parisiens.com/"> Comfort Inns in Paris </option> </select> </td></tr> <tr><td> <a href="http://www.deluxe-international.com/" onMouseover="ChangeImage($Car1); return true;" onMouseout="ChangeImage($Car0); return true;"> <img name="car" src="car0.gif" /> </a> </td></tr> <tr><td> <?} OutButton(submit,"State","Main Menu"); ?> </td></tr> </table> </div> </form> <? } // // Function: Intro // // Purpose: This function takes a message $MSG and if it exists // outputs in blue followed by the intro screen to // the Travel Planner program. If $MSG is false it // just outputs the intro screen. If $MSG has some value // then any of the form variables is not set it also // outputs a star by this element in the intro screen. // function Intro($MSG=false) { GLOBAL $DEPCITY, $DESCITY, $DEPDATE; if ($MSG) {print "<h3 style=\"color:blue\"> $MSG</h3>";} ?> <h1>Travel Planner</h1> <form method="POST" action="hw6.php" > <h3>Previous Itinerary: <? OutButton("submit","State","Fetch Now");?> </h3> </form> <hr> <form method="POST" action="hw6.php" onSubmit="return VerifyDate();"> <table border="0" cellpadding="3" cellspacing="3"> <tr> <td><b>Departure City or Airport:</b></td> <td><? OutText("DEPCITY", "$DEPCITY", 15, 80); if($MSG && !$DEPCITY) {OutStar();} ?> </td> </tr> <tr> <td><b>Destination City or Airport:</b></td> <td><? OutText("DESCITY", "$DESCITY", 15, 80); if($MSG && !$DESCITY) {OutStar();} ?> </td> </tr> <tr> <td><b>Departure Date:</b></td> <td><? OutText("DEPDATE", "$DEPDATE", 15, 80); if($MSG && !$DEPDATE) {OutStar();} ?> </td> </tr> <tr> <td></td> <td>YYYY-MM-DD </td> </tr> <td align="center" colspan="2"> <h3> <?OutButton("reset","reset","Reset"); OutButton("submit","State","Show Flights");?> </h3> </td> </table> </form> <?} // // Function:CKAirport // // Purpose: this function check if the three variables // $DEPCITY, $DESCITY, $DEPDATE all have values. // If not it returns the string "Sorry, you did not give // me enough data. Please fill in the starred fields." // Otheriwse, it looks at the Airport table of the airtransportation // database to see if $DEPCITY and $DESCITY are codes for // airports or are cities. If they are cities but there // is only one airport in that city the $DEPCITY or $DESCITY // is then set to the code of that airport. If at this // point both $DEPCITY and $DESCITY are codes of airports // then the value "Flight" is returned. If neither a code nor // a city could be found then "Sorry we not service $DEPCITY" // or "Sorry we nor service $DESCITY" or both is returned // by CKAirport. Finally, if there is more airport for $DESCITY // of $DEPCITY of both it produces a form with selection // selection gadgets to let the user pick between the possibilities. // after generating this form it returns the value "done". // function CKAirport() { GLOBAL $DEPCITY, $DESCITY, $DEPDATE; $DEPCITY=DeleteSharp($DEPCITY); $DESCITY=DeleteSharp($DESCITY); if (!($DEPCITY && $DESCITY && $DEPDATE)) { $ERRMSG = "Sorry, you did not give me enough data. Please"; $ERRMSG .= " fill in the starred fields."; return $ERRMSG; } $dbh=Connect(); $cur=Prepare("select code from Airport where city='$DEPCITY' OR code='$DEPCITY'"); if(NumRows($cur)==0) { $ERRMSG.= "Sorry, we do not service $DEPCITY.<br />\n"; $DEPCITY = false; } if(NumRows($cur)==1) {$row=FetchRow($cur); $DEPCITY = $row[0]; $isAirport1=true; } FreeCursor($cur); $cur=Prepare("select code from Airport where city='$DESCITY' OR code='$DESCITY'"); if(NumRows($cur)==0) { $ERRMSG .= "Sorry, we do not service $DESCITY.<br />\n"; $DESCITY = false; } if(NumRows($cur)==1) { $row=FetchRow($cur); $DESCITY = $row[0]; $isAirport2=true; } FreeCursor($cur); if(!$DEPCITY || !$DESCITY) {Close($dbh); return $ERRMSG;} if($isAirport1 && $isAirport2) {Close($dbh); return "Flight";} ?> <form method="POST" action="hw6.php"> <? $cur=Prepare("select code from Airport where city='$DEPCITY'"); if(NumRows($cur) > 1) { print "<h3> Please select a departure airport:</h3>\n"; DrawSelect($cur,"DEPCITY",2); print "<br />"; } else { OutButton("hidden","DEPCITY","$DEPCITY");} FreeCursor($cur); $cur=Prepare("select code from Airport where city='$DESCITY'"); if(NumRows($cur) > 1) { print "<h3> Please select a destination airport:</h3>\n"; DrawSelect($cur,"DESCITY",2); print "<br />"; } else { OutButton("hidden","DESCITY","$DESCITY");} FreeCursor($cur); OutButton("hidden","DEPDATE","$DEPDATE"); OutButton("submit","State","Main Menu"); OutButton("submit","State","Show Flights"); ?> </form> <? Close($dbh); return "done"; } // // Function: Flight // // Purpose: produces the screen that allows the user to // select the from a list of available flights // between $DEPCITY and $DESCITY on $DEPDATE. // Queries the airtransportation database Flight // table to get this info. // function Flight() { GLOBAL $DEPCITY, $DESCITY, $DEPDATE; $dbh=Connect(); $cur=Prepare("select flightNo, airCraftName, dateTime from Flight where fromAirport='$DEPCITY' AND toAirport='$DESCITY' AND dateTime like '$DEPDATE%'"); ?> <h1>Travel Planner</h1> <hr> <form method="POST" action="hw6.php"> <table> <tr> <td> <h3>Please select a flight:</h3> </td> </tr> <tr> <td> <? DrawSelect($cur, "FLIGHT", 10); Close($dbh); ?> <td> </tr> <tr> <td> <? OutButton("hidden","DEPCITY",$DEPCITY); OutButton("hidden","DESCITY",$DESCITY); OutButton("hidden","DEPDATE",$DEPDATE); OutButton("submit","State","Main Menu"); OutButton("submit","State","Continue"); ?> </tr> </td> </table> </form> <?} // // Function: SetCookies // // Purpose: sets cookies to store the variables // $DEPCITY, $DESCITY, $DEPDATE, $FLIGHT, $SEAT // function SetCookies() { GLOBAL $DEPCITY, $DESCITY, $DEPDATE, $FLIGHT, $SEAT; SetCookie("DEPCSAVE","$DEPCITY"); SetCookie("DESCSAVE","$DESCITY"); SetCookie("DEPDSAVE","$DEPDATE"); SetCookie("FLIGHTSAVE","$FLIGHT"); SetCookie("SEATSAVE","$SEAT"); } // // Function: Itinerary // // Purpose: if $saved is equal to "saved". It copies the variables // stored in the cookies back into the variables // $DEPCITY, $DESCITY, $DEPDATE, $FLIGHT, $SEAT first. // In all cases, it then draws the itinerary that the // user has selected so far followed by the buttons // Main Menu, Previous, and Save Itinerary. // these either return to the Intro screen, select seat // screen or returns to Intro screen with saved info // message and where the first line of the program has been // execute to set the appropriate cookies. // function Itinerary($saved) { GLOBAL $DEPCITY, $DESCITY, $DEPDATE, $FLIGHT, $SEAT; GLOBAL $DEPCSAVE, $DESCSAVE, $DEPDSAVE, $FLIGHTSAVE, $SEATSAVE; if($saved=="saved") { if(!$DEPCSAVE) return Intro("No previous itinerary"); $DEPCITY=$DEPCSAVE; $DESCITY=$DESCSAVE; $DEPDATE=$DEPDSAVE; $FLIGHT=$FLIGHTSAVE; $SEAT=$SEATSAVE; } $flArray = split( "#", $FLIGHT); $flightNo = $flArray[0]; ?> <h1>Travel Planner</h1> <hr> <h3>Your current schedule is as follows:</h3> <p>You are leaving on: <? print "$DEPDATE."; ?></p> <p>You are flying from: <? print "$DEPCITY."; ?></p> <p>You are flying to: <? print "$DESCITY."; ?></p> <p>The flight number is: <? print "$flightNo."; ?></p> <p>Your seat is: <? print "$SEAT."; ?></p> <form method="POST" action="hw6.php"> <? OutButton("hidden","DEPCITY",$DEPCITY); OutButton("hidden","DESCITY",$DESCITY); OutButton("hidden","DEPDATE",$DEPDATE); OutButton("hidden","FLIGHT",$FLIGHT); OutButton("hidden","SEAT",$SEAT); OutButton("submit","State","Main Menu"); OutButton("submit","State","Previous"); OutButton("submit","State","Save Itinerary"); ?> </form> <? } // // Function: SelectSeat // // Purpose: This function draws the screen to allow the user to pick a // from the available seats on a given flight. // function SelectSeat() { GLOBAL $DEPCITY, $DESCITY, $DEPDATE, $FLIGHT; $flArray = split( "#", $FLIGHT); $flightNo = $flArray[0]; $aircraft = $flArray[1]; $dateTime = $flArray[2]; ?> <h1>Travel Planner</h1> <hr> <form method="POST" action="hw6.php"> <table> <tr> <td> <h3>Please select a seat:</h3> </td> </tr> <tr> <td> The information below is formatted as follows: </td> </tr> <tr> <td> Row#Seat#Aisle?#Window?#Class </td> </tr> <tr> <td> <? print "<select name=\"SEAT\" size=\"10\">\n"; $flag=true; $dbh=Connect(); // // Notice I open up two cursors at this point. I wouldn't // need to do this on a database // $cur=Prepare("select rowNo, seat,aisle,window, class from AircraftRow where airCraftName = '$aircraft'"); while($row = FetchRow($cur)) { $cur2=Prepare("select rowNo, seat from Bookings where flightNo='$flightNo' and dateTime='$dateTime' and rowNo='$row[0]' and seat='$row[1]' "); if(!FetchRow($cur2)) { OutOption($flag,$row); if($flag) {$flag=false;} } } Close($dbh); ?> </select> <td> </tr> <tr> <td> <? OutButton("hidden","DEPCITY",$DEPCITY); OutButton("hidden","DESCITY",$DESCITY); OutButton("hidden","DEPDATE",$DEPDATE); OutButton("hidden","FLIGHT",$FLIGHT); OutButton("hidden","SEAT2","true"); OutButton("submit","State","Main Menu"); OutButton("submit","State","Previous"); OutButton("submit","State","Continue"); ?> </tr> </td> </table> </form> <?} // // Function: OutButton // // Purpose: draws to screen a button of type $type with name $name // and with value $value. // function OutButton($type,$name,$value) { print "<input type=\"$type\" name=\"$name\" value =\"$value\" />"; } // // Function: OutText // // Purpose: draws to screen a textfield of type $type with name $name // and with value $value of size $size and max number of char's // maxlength. // function OutText($name,$value,$size,$maxLength) { print "<input type=\"text\" name=\"$name\" value =\"$value\""; print " size=\"$size\" maxlength=\"$maxLength\" />"; } // // Function: OutStar // // Purpose: draws a bold-face blue star // function OutStar() { print "<b style=\"color:blue\">*</b>\n"; } // // Function: OutOption // // Purpose: Writes out an option of a selection gadget // If $selected is true this will be a selected option // of the selection gadget. $row is the value of the option. // function OutOption($selected,$row) { if($selected) {print "<option selected=\"true\">"; $flag=false; } else {print "<option>";} foreach($row as $field) { print "$field#"; }?> </option> <?} // // Function: DeleteSharp // // Purpose: returns the substring of $string before the first # symbol // function DeleteSharp($string) { $row=split("#",$string); return $row[0]; } // // Function:DrawSelect // // Purpose: Draws a selection gadget with name $name where the options // are given by cycling over the rows returned by the database // cursor $cursor. // function DrawSelect($cursor, $name, $rowsVisible) { print "<select name=\"$name\" size=\"$rowsVisible\">\n"; $flag=true; while($row = FetchRow($cursor)) { OutOption($flag,$row); if($flag) { $flag=false;} }?> </select> <?} // // Function:Connect // // Purpose: connect to the database system. // function Connect() { return mysql_connect("localhost", "pic40", "pic40"); } // // Function: FetchRow // // Purpose: // function FetchRow($cursor) { return mysql_fetch_row($cursor); } // // Function:NumRows // // Purpose: returns the numbers of rows left in database cursor $cursor. // function NumRows($cursor) { return mysql_num_rows($cursor); } // // Function: Prepare // // Purpose: prepares an SQL query to be executed // function Prepare($query) { return mysql_db_query("airtransportation", $query); } // // Function:FreeCursor // // Purpose: frees a cursor // function FreeCursor($cursor) { mysql_free_result($cursor); } // // Function: Close // // Purpose: closes a database handle $dbhandle // function Close($dbhandle) { mysql_close($dbhandle); } ?> |