Tak, wiem że kopię...

Robię to jednak dlatego, że ten wątek pojawia się dosyć wysoko w google, a udzielona odpowiedź nie do końca rozwiązuje problem.
Wpadłem właśnie na pomysł, bardzo prosty pomysł.
Podczas wysyłania formularza, wysyłamy także dodatkowy ukryty input, który przechowuje wartość wygenerowaną przez funkcję rand() - czyli krótko mówiąc jakąś liczbę z przedziału dziesiątek tysięcy. Szansa więc na powtórzenie się tej samej wynosi 1 do kilkudziesięciu tysięcy. Pobraną wartość rand() z formularza zapisujemy w sesji i przed wykonaniem np. zapytania do bazy (bo to jest z reguły największym problemem) sprawdzamy czy nowa sesja jest identyczna z tą, która zapisaliśmy wcześniej. Jeśli tak, oznacza to że użytkownik odświeżył stronę, a my zablokujemy mu możliwość ponownego wykonania kodu (w tym wypadku zapytania do bazy).
<?php
if(isset($_POST['submit'])){ if(!isset($_SESSION['sesja']) || (isset($_SESSION['sesja']) && $_SESSION['sesja'] != $_POST['sesja'])){ $_SESSION['sesja'] = $_POST['sesja'];
//zapytanie do bazy
}
else
echo 'Odświeżyłeś stronę'; }
echo '<form action="" method="POST"> <input type="hidden" name="sesja" value="'.rand().'" /> <input type="submit" name="submit" value="Wyślij" />
</form>';
?>
Wpadłem na to jak widać o 1:51. Pomysł może być kulawy, jednak na tę chwilę wydaje mi się, że wszystko działa jak należy. Jeśli ktoś bardziej zaawansowany na to spojrzy, fajnie gdyby stwierdził czy to rzeczywiście jest takim świetnym rozwiązaniem.
@EDIT
Przeglądając dalej google z ciekawości, czy ten sposób jest rzeczywiście wystarczający dowiedziałem się że to co przedstawiłem potocznie nazywa się tokenem - a to wcale nic nowego.

W każdym razie tak jak napisałem na początku. Po wpisaniu hasła "blokada podwójnego wysłania formularza" w google, temat ten jest na pierwszym miejscu, a więc warto było podbić wątek.