Version: 0.2
Type: Full Script
Category: Other
License: GNU General Public License
Description: This script looks up a city and state for a given zip code from the USPS web cgi for the same task. I made it for a shopping cart shipping information form where we determine the city and state by a user selection from a list of valid cities and states for their zip code. I decided to post it here because I am angry that there are no publicly available free zip code databases. One would think it should be public record. This script simply posts a fake browser POST to USPS' web cgi for looking up zip codes and formats the data returned into nice variables and prints out the results in a table. Hopefully this will save someone out there the time and money involved in the purchase of a zip code database. I wrote this script August 1st 2001, and as long as the USPS haven't changed their zip code lookup cgi this script will work fine for you. Simply post a 'shipZip' field to this script, and you will be returned a table of valid cities and states for that zip code courtesy of USPS.
<table border='1'>
<tr><td colspan=4><center><b><?php print $shipZip; ?></b></center></td></tr>
<tr bgcolor=#D5DDFF>
<td>City</td>
<td>State</td>
</tr>
<?php
$poststring="POST /cgi-bin/zip4/ctystzip2 HTTP/1.0\n".
"From: jfdk@jfjdf.com\n".
"User-Agent: Internet Explorer 5.0/1.0\n".
"Content-Type: application/x-www-form-urlencoded\n".
"Content-Length: 21\n\n".
"FormsEditField1=$shipZip\n";
$fp = fsockopen("www.usps.gov", 80, $errno, $errstr, 30);
if (!$fp) { echo "$errstr ($errno)<br>\n"; } else {
fputs($fp, $poststring);
$buffer="";
while (!feof($fp)) { $buffer="$buffer".fgets($fp,128); }
fclose ($fp);
$bufferarray = explode("\n",$buffer);
$i=0;
while($i <= count($bufferarray)) {
if(strstr($bufferarray[$i],"ACCEPTABLE")) { $resultstring=$bufferarray[$i]; }
$i++; }
$resultarray = spliti("<br>",$resultstring);
$i=0;
while($resultarray[$i]) {
if($i >= 3) {
if(!strstr($resultarray[$i],"NOT ACCEPTABLE") && strstr($resultarray[$i],"ACCEPTABLE")) {
$j = trim(substr($resultarray[$i], 0, strpos($resultarray[$i],"ACCEPTABLE")));
$k = strrpos($j," ");
$cityname = trim(substr($j, 0, $k));
$statestring = trim(substr($j, $k));
$statename = $statestring[0].$statestring[1]; // Why did you do this????
if(($i % 2) == 0) { $rowattr = "bgcolor=#EEEEEE"; } else { $rowattr = ""; }
print "<tr $rowattr>\n";
print " <td>$cityname</td>";
print " <td>$statename</td>";
print "</tr>"; } }
$i++; } }
?>
</table></body></html>