I know there are web services out that have this information, however they can be limited to per day requests. I have about 114,000 records I need zip codes for. I have a data base full of zip codes with there lat and longs. However I am not sure how I can calculate the given lat and long against the zip code lat and long.
Basically I need to cross reference the given address lat and long against the supplied zip code lat and long. I can either use PHP, Java, or MySQL Procedure or just a calculation.
I can give you a stepping stone but thats about it, in this case.
if you create a query that does a JOIN between the 2 tables you have and reduce the distance to 1 or 2, you could in concept come up with just about all the lat/lon combinations you need. Or you could also find a DB that has all the US zipcodes, that also has lat/lon then query over one table to insert into another based on the matched zipcodes. I have such a zipcode DB somewhere.
also might I suggest http://www.maxmind.com/app/geolite its never complete less you wanna pay for it and it changes up every so often but. From this you can get almost nearly every combination of lat/lon possible to use as your reference point based on IP of a visitor (its off a little in some cases as the IP may steam from a hub a town or 2 away. But its better than nothing, gives you only limits your server can handle, and no worry about API restrictions outside of usage terms from maxmind.
Anyway all in all, Ive been using this combination for a while on a number of sites and have yet to come up with much problems to date. Well I know its not a direct answer to your question but I hope it leads you to a solution