I think it's an Iphone's internal aerial problem. I have a 3GS, in my office I cannot receive 3G. My oppo however, who has an Iphone 4 can. My wife has an Iphone 4. In the same room she receives a different signal to mine, sometimes better, sometimes worse.
I also find that when I do have 3G it sometimes disconnects and takes nearly a minute searching for a network again.
I have read that switching to airplane mode for 30 seconds then reverting can solve certain connectivity problems. I have tried this and it does appear to work!
Edit: I'm with T-mobile.