$value) { $$key = $value; } $ch = curl_init(); $ch = $this->init_curl($ch,$url,$postfields,$follow,$cookie); $page = curl_exec($ch); curl_close($ch); return $page; } } // end class /** * A simple wrapper for db functions * */ class db_custom { /** * Constructor * * A simple wrapper for database functions * */ function db_custom() { // database configuration $host = "mysql5-1.webhost.co.nz"; $user = "post"; $pass = "code2001"; $db = "finder"; $iconnumber = 0; $storenumber = 0; // open database connection $connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); // select database mysql_select_db($db) or die ("Unable to select database!"); } ############################################### ## Updates an array of fields and values ## and reurn the resulting ID ############################################### function quick_update($database,$fields,$values,$wherearray) { //Variables //Format NULL $values = str_replace("'NULL'","NULL",$values); //Write query $query = "UPDATE `$database` SET "; foreach ($fields AS $key=>$value) { $count++; $query .= " $fields[$key] = '$values[$key]'"; if ($count <> $num_array) { $query .= ","; } } //Create where foreach ($wherearray AS $key=>$value) { $counterv++; $query_chk .= "$key = '" . trim($value) . "'"; if ($counterv != count($wherearray)) { $query_chk .= " AND "; } } $query .= " WHERE $query_chk"; $query = str_replace("'`","",$query); $query = str_replace("`'","",$query); $result = mysql_query($query) or die ("Error in query: $query. " . mysql_error()); $rows = mysql_affected_rows(); return $rows; } ###################################################### # Execute row # runs query and gets row back ###################################################### function executeRow($query__ER,$type=null) { $result__ER = mysql_query($query__ER) or die ("Error in query: $query__ER. " . mysql_error()); if($result__ER != 1) { if($type!="array") { $row__ER = mysql_fetch_object($result__ER); } else { $row__ER = mysql_fetch_assoc($result__ER); } return $row__ER; } } ###################################################### # Connects to the database and returns the # results in an array ###################################################### function executeQuery($query,$func=null,$type="") { //Get the table name from the query preg_match("/SELECT(.*)FROM( )([A-z_]+)/i",$query,$matches); $table_name = $matches[3]; $result = mysql_query($query) or die ("Error in query: $query. " . mysql_error()); $rows = mysql_num_rows($result); $columns = mysql_fetch_assoc($result); if ($rows > 0) { // Only proceed if we have a result mysql_data_seek($result,0); while ($row=mysql_fetch_array($result)) { foreach ($columns As $key=>$value) { //Run any extra functions that have been sent over if(is_array($func)) { foreach ($func AS $Fkey=>$Fvalue) { $row[$key] = $this->$Fvalue($row[$key],$key,$table_name); } // end FE } // end IF if($type == "object") { //echo $key . " " . $row[$key] . "\n"; $tmp->$key = $row[$key]; } else { $tmp[$key] = $row[$key]; } }// end for each $results[] = $tmp; unset($tmp); } //end while $final_result['result'] = $results; $final_result['rows'] = mysql_num_rows($result); } else { $final_result['rows'] = 0; }// end if return $final_result; } // end function } /** * A postcode finder class * */ class postcode_finder { /** * Constructor * */ function postcode_finder($array) { if(is_array($array)) { foreach($array AS $key=>$value) { $this->$key = $value; } } //DO stuff } /** * Setup database tables and insert lat longs * */ function setup() { $this->create_store_table(); $this->insert_example_stores(); $this->update_lat_lngs(); } /** * Update lat lngs * */ function update_lat_lngs() { //Get the list of stores $query = "SELECT * FROM store WHERE `lat` = '' LIMIT 0,5"; $stores = $this->db->executeQuery($query); $stores = $stores['result']; //Run through stores and get lat / lng foreach($stores AS $store) { $latlng = $this->get_lat_long($store['postcode'],$store['domain']); //Update store with its lat lng $this->db->quick_update("store", array('lat','lng'), array($latlng['lat'],$latlng['lng']), array('id'=>$store['id']) ); } } /** * Returns a lat / long of a given postcode * */ function get_lat_long($postcode,$domain=null) { if(!$domain) { $domain = "co.nz"; } $url = "http://maps.google." . $domain . "/maps/geo?q=" . urlencode($postcode) . "&output=json&key=ABQIAAAA1l5pmVMd_xUrbjiM0vtYoxT-LMONdZkkT78iPm5eV9k2MBHlxRRlsC3iCm01TlP3B7tw-vlcgbr0AA"; $json = $this->curl->get_page(array("url"=>$url)); $store_data = json_decode(str_replace(""","\"",htmlentities($json))); //Take care of accents $lng = $store_data->Placemark[0]->Point->coordinates[0]; $lat = $store_data->Placemark[0]->Point->coordinates[1]; //Return if($lng && $lat) { return array('lat'=>$lat, 'lng'=>$lng ); } else { return false; } } /** * Get a list of our stores, sorted by distance to this postcode * */ function get_stores_list($postcode) { //If it's a UK postcode then format correctly $postcode = $this->checkPostcode($postcode); $latlng = $this->get_lat_long($postcode); if(!$latlng) { //Unrecognised postcode return false; } $latitude = $latlng['lat']; $longitude = $latlng['lng']; // print_r($latlng); $query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`lat`*pi()/180)) +cos((".$latitude."*pi()/180)) * cos((`lat`*pi()/180)) * cos(((".$longitude."- `lng`)*pi()/180))))*180/pi())*60*1.1515) as distance FROM `store` ORDER BY distance ASC LIMIT 0,5 "; $stores = $this->db->executeQuery($query); $stores = $stores['result']; return $stores; } /** * Checks whether supplied postcode is a valid UK postcode */ function checkPostcode($toCheck) { $orig = $toCheck; // Permitted letters depend upon their position in the postcode. $alpha1 = "[abcdefghijklmnoprstuwyz]"; // Character 1 $alpha2 = "[abcdefghklmnopqrstuvwxy]"; // Character 2 $alpha3 = "[abcdefghjkstuw]"; // Character 3 $alpha4 = "[abehmnprvwxy]"; // Character 4 $alpha5 = "[abdefghjlnpqrstuwxyz]"; // Character 5 // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA $pcexp[0] = '^('.$alpha1.'{1}'.$alpha2.'{0,1}[0-9]{1,2})([0-9]{1}'.$alpha5.'{2})$'; // Expression for postcodes: ANA NAA $pcexp[1] = '^('.$alpha1.'{1}[0-9]{1}'.$alpha3.'{1})([0-9]{1}'.$alpha5.'{2})$'; // Expression for postcodes: AANA NAA $pcexp[2] = '^('.$alpha1.'{1}'.$alpha2.'[0-9]{1}'.$alpha4.')([0-9]{1}'.$alpha5.'{2})$'; // Exception for the special postcode GIR 0AA $pcexp[3] = '^(gir)(0aa)$'; // Standard BFPO numbers $pcexp[4] = '^(bfpo)([0-9]{1,4})$'; // c/o BFPO numbers $pcexp[5] = '^(bfpo)(c\/o[0-9]{1,3})$'; // Load up the string to check, converting into lowercase and removing spaces $postcode = strtolower($toCheck); $postcode = str_replace (' ', '', $postcode); // Assume we are not going to find a valid postcode $valid = false; // Check the string against the six types of postcodes foreach ($pcexp as $regexp) { if (ereg($regexp,$postcode, $matches)) { // Load new postcode back into the form element $toCheck = strtoupper ($matches[1] . ' ' . $matches [2]); // Take account of the special BFPO c/o format $toCheck = ereg_replace ('C\/O', 'c/o ', $toCheck); // Remember that we have found that the code is valid and break from loop $valid = true; break; } } // Return with the reformatted valid postcode in uppercase if the postcode was // valid if ($valid){ return $toCheck; } else { $this->non_standard_postcode = true; return $orig; }; } } //If we have a post if($_GET['postcode']) { //Start database class $db = new db_custom(); $curl = new curl(); $finder = new postcode_finder(array('db'=>$db, 'curl'=>$curl)); $stores = $finder->get_stores_list($_GET['postcode']); } if($_GET['fill']) { $db = new db_custom(); $curl = new curl(); $finder = new postcode_finder(array('db'=>$db, 'curl'=>$curl)); $finder->setup(); } ?>
To find your closest stores, please enter your postcode OR suburb into the field below.
Enter your postcode or suburb below

Database filled


Based on distance from centre of your postcode to store location

The following are your closest retail stores



  
Ph:
Approximately 0 km from you