You would have to store latitude and longitude coordinates for any locations you wanted a vicinity search for in the database. You can use Google's geocoding service to do that on the page where the address is entered on the insert or update page automatically.
Then you could use geocoding on the search page to get the latitude and longitude for a postal code or address they are using for a starting point.
Then you can use a complex SQL statement to get the results like:
$radius = 20;
$sql = 'SELECT * FROM locations WHERE (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578)*cos('.$lat.'/57.29578)*(Longitude-'.$lon.')*(Longitude-'.$lon.'))/180) <= '.$radius;
This SQL assumes your locations table has columns named Latitude and Longitude and uses $lat and $lon as the calculated latitude and longitude from your search form.