Empêcher la réactualisation, c'est impossible. Par contre, on peut contourner le problème des insertions multiples assez facilement.
L'idée, c'est de séparer le traitement du formulaire (avec les insertions en base de données) de l'affichage du résultat de l'opération. La page de traitement va s'occuper uniquement des accès à la base de données, sans afficher quoi que ce soit, et à la fin, elle fera un redirect vers la page d'affichage du résultat. Comme la page de résultat ne fait aucun traitement, l'utilisateur pourra la rafraichir autant qu'il veut, ça ne changera rien.
Je ne suis pas sûr d'être super clair, donc voici un exemple de séquence d'événements :
- on affiche un formulaire (formulaire.php)
- l'utilisateur le rempli, et soumet le formulaire
- on va faire un POST sur la page traitement.php avec les données du formulaire
- traitement.php va insérer/modifier les données en base. Rien n'est affiché
- traitement.php va rediriger (via fonction "header" ) vers la page resultat.php
- resultat.php indique à l'utilisateur que tout s'est bien passé (ou qu'il y a eu des erreurs)
- si l'utilisateur appuie sur F5, ça ne pose pas de problème, vu qu'on est sur une page qui ne modifie rien en base de données