I always use the Post/Redirect/Get method on my forms. My forms generally always submit to themselves. However, when I have an error in the form, I don't send any new headers. This is so I can easily do stuff like this
<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
The PHP is just a library function that handles 2 arguments, the $_POST key and a default value if it isn't present.
This means if someone makes an error in the form, they don't have to refill out the form a second time. The disadvantage is that reloading the page gives them the POST warning in their browser.
Is there anyway to avoid this, without using something for state (i.e. cookies, session, database etc)