How to Code a Simple Zip Code Locator in PHP

3. Set up database and tables

Make a database, or use an existing one you have. I used phpMyAdmin to make a database called ‘Locator’.
You’ll need to set up the table for your zipcode now. Since this table is so huge, I had to do this in steps. Create the table first:

CREATE TABLE `zip_codes` (
  `zip` varchar(5) NOT NULL default '',
  `state` char(2) NOT NULL default '',
  `latitude` varchar(10) NOT NULL default '',
  `longitude` varchar(10) NOT NULL default '',
  `city` varchar(50) default NULL,
  `full_state` varchar(50) default NULL,
  UNIQUE KEY `zip` (`zip`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Now import the sql downloaded in step 2. This is a giant table, so if you are working on a remote server and using phpMyAdmin or a similar tool, you might have to insert the records in sections (I could do 10,000 at a time).

Now we need something to locate. I created a store locator, and my ’stores’ table looks like this:

CREATE TABLE `stores` (
  `id` int(11) NOT NULL auto_increment,
  `company` varchar(50) NOT NULL default '',
  `address1` varchar(50) default NULL,
  `address2` varchar(50) default NULL,
  `city` varchar(25) default NULL,
  `state` char(2) default NULL,
  `zip` varchar(5) NOT NULL default '0',
  `phone1` varchar(10) default NULL,
  `phone2` varchar(10) default NULL,
  `email` varchar(50) default NULL,
  PRIMARY KEY  (`id`),
  KEY `zip` (`zip`)
);

Obviously, the important part in your store table is the zip, and you can add any other info you want.

Go to to step 4 »

Pages: 1 2 3 4 5

if you liked this post :)

Category: Programming | 15,461 views | Posted: October 22nd 2007 07:00 am

Related Posts

5 Comments »

MyAvatars 0.2

Comment by James Ehly
on 22 Oct 2007 at 9:42 am #

Well I just figured out a logical error in the script. If you find by state first then that might not actually be the closest location to you (since there might be a closer location in the state next to you). Just comment out the lines about querying the state first and you should be fine. However, I assume doing this will slow the code down quite a bit if you have a ton of locations to search against. Maybe caching the queries somehow would be in order.

James

 

[...] spam and web stats: Usi…How to Code a Simple Zip Code Loc…WPA Can also be Cracked!!…Out sick: Preparing for a regular…Getting Technorati Authority [...]

 
MyAvatars 0.2

Comment by Internet Television
on 24 Jan 2008 at 4:16 pm # Subscribed to comments via email

That’s absolutely beautiful, great work.

 
MyAvatars 0.2

Comment by josh
on 01 May 2008 at 8:17 am #

What do i have to do to show more stores?

MyAvatars 0.2

Comment by James Ehly
on 01 May 2008 at 8:44 am #

A few people have asked me this, so here is the looping code you’ll need.

Find this line and add some code like this…

// now we can display closest store
// optionally you could loop over this to list multiple stores
$store = $storeinfo[key($stores)];
print "<p>The web developers closest to: $findzip</p><br>\n";
$maploc = "’You are here’,'$findzip’,";
foreach($stores as $k=>$v) {
$output .= "<h3 style=’margin:0;padding:0′><b>".$info[$k]['company']."</b><br>(approx ".round($v)." miles)</h3>";
$output .= "<p style=’margin:0 0 10px 0;padding:0′><a href=’".$info[$k]['url']."’>".$info[$k]['url']."</a><br>";
$output .= $info[$k]['city']." ".$info[$k]['state'].", ".$info[$k]['zip']."</p>";
$maploc .= "’".$info[$k]['company']."’,'".$info[$k]['address1']." ".$info[$k]['city']." ".$info[$k]['state']." ".$info[$k]['zip']."’,";
}
$maploc = substr($maploc,0,-1);

And here are the changes to the javascript:

<script>
// this is the address we want to map (you can list several and it will mark each one)
var addresses = new Array(<?=$maploc?>);
// Create and display Map object at the address with zoom level 3
// Include your application ID.
var map = new Map("mapContainer", "[your api key here]", "<?=$maploc?>",20);
map.addEventListener(Map.EVENT_INITIALIZE, onMapInit);
map.addEventListener(Map.EVENT_MARKER_GEOCODE_SUCCESS,onMarkerGeocode);
function onMapInit(eventObj) {
map.addTool( new PanTool(), true );
for(var i=0; i<addresses.length; i=i+2) {
//alert(addresses[i]);
//alert(addresses[i+1]);
// if you did do multiple addresses, then this would have to change some (because it would be the same store each iteration)
var marker = new CustomPOIMarker(addresses[i], ”, addresses[i+1], ‘0×000000′, ‘0xFFFFFF’);
map.addMarkerByAddress( marker, addresses[i+1] );
}
map.addWidget( new ZoomBarWidget() );
}
function onMarkerGeocode(eventObj) {
var geocodeResponse = eventObj.response;
}
</script>

Basically what you are doing is building an array of results and looping over then with the javascript.

Hope this helps. James

 
 
Name (required)
E-mail (required - never shown publicly)
URI
Subscribe to comments via email
Your Comment (smaller size | larger size)
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> in your comment.

« Links from the Trench #8 | Did You Pass the BlogRush Test? »