It appears that on my 3G iPhone, it is doing a poor job switching back to EDGE network when 3G connection is weak. This often leads to an error message prompting me that the iPhone has failed to establish data connection. Since I've owned other 3G devices in the past (AT&T 8525 and Nokia N95-3), I am not surprised that 3G connection is not always available depending on where you are. However, in all my historical mobile experiences, those 3G devices would quickly downgrade it's network into 2/2.5G or EDGE(GPRS) network thus providing seemless internet access with seeing the full signal bars.
To my knowledge, the iPhone 3G has the same ability to auto-detect and switch down to EDGE; however, I think the way its setup is not sensitive enough to coop with real world needs. For instance, I should never have been prompted a failure to establish data network until the iPhone has attempted to kickdown to a slower speed network; because as is, leaving me hanging without any data connection is not a desirable mobile experience.
A work-around is to manually turn 3G off, it will force the iPhone to run on EDGE, and you'll see more bars.