Jump to content

Store Locator


shalli

Recommended Posts

Hi

 

I have created a store locator that displays the nearest store nearest to the postcode a user types in. But what I would like to add is a functionality that if a postcode is typed that aint near say se (london) yo (york) s(sheffield)

then its redirects to headoffice.

 

Is that possible. Any help much appreciated

Link to comment
https://forums.phpfreaks.com/topic/200666-store-locator/
Share on other sites

hi Teddykiller

 

Thanks for your response

 

Here is my code

 

/**

* The curl class

*/

class curl {

 

/**

* COnstructor

*/

function curl() {

 

 

 

}

 

function init_curl($ch,$url,$postfields=null,$follow=null,$cookie=null,$referer=null) {

 

// Set url

curl_setopt($ch, CURLOPT_URL, $url);

 

// Enable Post

if($postfields) {

curl_setopt ($ch, CURLOPT_POST, 1);

curl_setopt ($ch, CURLOPT_POSTFIELDS, $postfields);

}

 

if($follow) {

curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1 );

}

 

if($referer) {

curl_setopt($ch, CURLOPT_REFERER, $referer);

}

 

//Enable SSL

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

 

 

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');

 

//Return results as string

curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

 

return $ch;

 

} // end function

 

 

/*

Grabs a page

*/

 

function get_page($options) {

 

//Set options

foreach($options AS $key=>$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 = "localhost";

$user = "xxxx";

$pass = "xxxx";

$db = "xxxx";

 

// 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

$num_array = count($values);

//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();

 

 

}

 

/**

* Makes an example store table

*

*/

function create_store_table() {

 

//Create table

$query = "CREATE TABLE IF NOT EXISTS `store` (

  `id` int(10) NOT NULL auto_increment,

  `name` varchar(75) NOT NULL default '',

  `address` text NOT NULL,

  `postcode` varchar(10) NOT NULL default '',

  `lat` double NOT NULL default '0',

  `lng` double NOT NULL default '0',

  `domain` varchar(10) NOT NULL default '',

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM";

$this->db->executeRow($query);

 

 

 

 

}

 

/**

* Insert some example stores

*

*/

function insert_example_stores() {

 

//for($i=0;$i<1000;$i++) {

 

//$query = "

//INSERT INTO `store` (`name` , `address` , `postcode`, `domain`)

//VALUES (

//'Waterloo Station', 'Lambeth, London', 'SE1', 'co.uk'

//), (

//'Gatwick Airport ', 'South Terminal, Gatwick', 'RH6', 'co.uk'

//), (

//'Edinburgh Waverley Railway Station ', 'Network Rail, Room 255, North Block, Edinburgh', 'EH1 1BB', 'co.uk'

//), (

//'Beverly Hills', 'California', '90210', 'com'

//), (

//'Penn Station ', '17 W 32nd St New York', '10001', 'com'

//), (

//'La Sagrada Familia', 'Barcelona', '08013', 'es'

//), (

//'FC Bayern Munchen', 'Sabener Str. 51, Munchen, Germany ', '81547', 'de'

//)

//";

 

//$this->db->executeRow($query);

 

//}

 

 

 

}

 

/**

* Update lat lngs

*

*/

function update_lat_lngs() {

 

//Get the list of stores

$query = "SELECT * FROM store

WHERE `lat` = ''

LIMIT 0,10";

$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['telephone'],$store['fax'],$store['managername']);

 

//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.uk";

}

 

$url = "http://maps.google." . $domain . "/maps/geo?q=" . urlencode($postcode) . "&output=json&key=ABQIAAAAWjc0ZH2RENLxziofASg9ABQH987j_SlqISv1l93HS7ksPkvN9xRAXjKLSj-Yj2Xw7I6gP3RHQb4UQg";

 

$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 1

";

$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();

}

 

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

 

<head>

 

<title>L4L Postcode Finder</title>

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

 

<!-- rounded corner css -->

<link rel="stylesheet" type="text/css" href="http://www.legal4landlords.com/css/niftyCorners.css" />

 

 

<link type="text/css" rel="stylesheet" href="http://www.legal4landlords.com/css/postcodestyle.css"  />

 

<!--

Aciddrop Theme Created by Leon Chevalier @ Aciddrop (http://www.aciddrop.com/)

-->

 

 

</head>

 

<body>

 

<div id="" style="width:645px;margin:0 auto">

 

<div style="padding-top: 0pt; padding-bottom: 0pt;" class="roundedByNifty" id="content"><b style="background-color: rgb(223, 223, 223);" class="artop"><b style="border-color: rgb(204, 204, 204); background-color: rgb(138, 199, 239);" class="re1"></b><b style="border-color: rgb(204, 204, 204); background-color: rgb(138, 199, 239);" class="re2"></b><b style="border-color: rgb(204, 204, 204); background-color: rgb(138, 199, 239);" class="re3"></b><b style="border-color: rgb(204, 204, 204); background-color: rgb(138, 199, 239);" class="re4"></b></b>

 

 

<div id="content_inner">

 

 

<div class="posts_content">

 

 

<div id="post_wrapper">

 

<br>

<br>

 

<form action="" method="get">

<fieldset>

<legend>Enter your postcode</legend>

 

<input type="text" name="postcode" value="<?= $_GET['postcode'] ?>">

<input type="submit" value="GO!">

 

</fieldset>

</form>

 

<? if ($_GET['fill']) { ?>

 

<h2 style="background-color:padding:2px">Database filled</h2>

 

<? } ?>

 

<? if ($_GET['postcode']) { ?>

 

<? if ($stores) { ?>

 

<h2 style="background-color:padding:2px">The following stores were found near to you</h2>

 

<? foreach($stores AS $store) { ?>

 

<p>

<h3><span id="storenameheading">Store Name:</span><span id="storename"><?= $store['name'] ?></span></h3>

<span id="storeaddressheading">Store Address:</span><span id="storeaddress"><?= $store['address'] ?></span><br>

<span id="storepostcodeheading">Store Postcode:</span><span id="storepostcode"><?= $store['postcode'] ?></span><br>

<span id="storetelephoneheading">Store Telephone:</span><span id="storetelephone"><?= $store['telephone'] ?></span><br>

<span id="storefaxheading">Store Fax:</span><span id="storefax"><?= $store['fax'] ?></span><br>

<span id="storemanagernameheading">Store Manager Name:</span><span id="storemanangername"><?= $store['managername'] ?></span><br>

<span style="background-color:#FFFFCC"><?= number_format($store['distance'],2) ?></span> miles from you

</p>

 

<? } ?>

 

<? } else { ?>

 

<h2 style="background-color:padding:2px">That postcode was not recognised</h2>

 

 

<? } ?>

 

 

<? } ?>

 

</div>

 

 

</div>

 

<div class="posts_content">

 

</div>

 

</div>

 

<b style="background-color: rgb(223, 223, 223);" class="artop"><b style="border-color: rgb(204, 204, 204); background-color: rgb(138, 199, 239);" class="re4"></b><b style="border-color: rgb(204, 204, 204); background-color: rgb(138, 199, 239);" class="re3"></b><b style="border-color: rgb(204, 204, 204); background-color: rgb(138, 199, 239);" class="re2"></b><b style="border-color: rgb(204, 204, 204); background-color: rgb(138, 199, 239);" class="re1"></b></b></div>

 

</div>

 

 

<div class="spacer_small"></div>

 

</div>

</body>

</html>

 

Link to comment
https://forums.phpfreaks.com/topic/200666-store-locator/#findComment-1053529
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.