No the problem here is simply refreshing the page asks the user to resubmit the data in its entirety which in turn becomes a new post request identical to the previous.
The way to get around that is to use a token on your form. It doesn't matter that its modifiable at all, but effectively what you do is specify a session value with this token, and apply that to the form. Then you check if the form token provided matches the token in the session. If it does, insert the data and destroy the token. If it doesn't simply indicate that the token has already been used. This will prevent the same data from being inserted or modified multiple times. It's much simpler than even the code on the blog link provided here.
Then when submitted:
$_SESSION['token'] = sha1(microtime(true)); // doesn't matter what this is, so long as it has randomness to it. Even microtime(true) is sufficient.
<input type="hidden" name="token" value="<?php echo $_SESSION['token'];?>" />
Simple as that.
if (isset($_POST['token'], $_SESSION['token']) && strcmp($_POST['token'], $_SESSION['token']) == 0)
// Its good
// go ahead with everything else.
print('The token provided is expired');
Hitting the back button shouldn't regenerate the token and add it to the session since the page is not re-requested from the server. So therefore the request to retransmit the post will include the previous token which will not match the session token.
If the page itself is a brand new request and the fields are filled in with the same data and submitted, there is no way to detect that this behaviour has occurred. You have to rely on your constraints to detect a duplicate, which depending on the purpose and structure depends if its doable. Every once and awhile I can manage to get a dual post here on the forums for example.