Evitar duplicación de registros con Refrescar (F5)

Indique el resultado buscado:

 

El valor del contador es:



<?php
session_start
();
//
//Redirecciona a una página relativa a la actual, acepta argumentos como http_build_query
function redireccion_relativa($relative_URL,$args null,$prefijo null) {
         if (!
is_null($args)) {
            
$relative_URL .= (strpos($relative_URL,'?')?'&':'?') . http_build_query($args,$prefijo);
         }

         
header("Location: http://{$_SERVER['HTTP_HOST']}" str_replace('\\','/',dirname($_SERVER['PHP_SELF']) . '/' $relative_URL));
         exit;
}

//
//Redirecciona a esta misma página con argumentos opcionales
function redireccion_aqui($argsnull,$prefijo null) {
         if (!
is_null($args)) {
            
$argURL '?' http_build_query($args,$prefijo);
         }
         
header("Location: http://{$_SERVER['HTTP_HOST']}" str_replace('\\','/',$_SERVER['PHP_SELF']) . $argURL);
         exit;
}

//
// Controla si se enviaron datos (submit)
if (!is_null($_GET['submit'])) {

   
// Esta parte es simplemente para el ejemplo.
   // Normalmente, se debería ejecutar una operación sobre la base de datos que debería funcionar o dar error
   // En este caso, preguntamos al usuario si desea que funcione o falle
   
if ($_GET['submit'] == 'Funciona') {
      
// Simulamos el efecto de tener éxito, en este caso, incrementamos un contador
      
if (array_key_exists('contador',$_SESSION)) $_SESSION['contador']++;
      else 
$_SESSION['contador'] = 1;
      
//
      // ***********************************************
      // ESTA ES LA PARTE IMPORTANTE
      // En caso de éxito, hacemos una redirección a esta misma página con un argumento que nos indica el éxito
      // Se deberán agregar los argumentos que se consideren necesarios para mostrar un mensaje de confirmación significativo
      
redireccion_aqui(array('confirma' => 'ok'));
   } else {
          
// Si la supuesta operación de SQL hubiera fallado, la actualización no se habría hecho
          // Como todavía no hemos enviado los 'headers' no podemos mostrar nada, por lo tanto lo guardamos para usar después
          
$resultado 'no funcionó';
   }
}
//
// Aquí llega después de la redirección anterior.
// Si se ejecuta las siguientes instrucciones no se habrán ejecutado las previas,
// o sea que en la confirmación no se actualiza la base de datos
if ($_GET['confirma'] == 'ok') {
  
$resultado 'Funcionó';
}
//
?>
<html><head>
<title>Evitar duplicación de registros con Refrescar (F5)</title>
</head>
<body>
<h1>Evitar duplicación de registros con Refrescar (F5)</h1>
<?php
     
// Acá muestro el mensaje que antes no podía mostrar por faltar los headers
     
if (!is_null($resultado)) {
          echo 
'<p>El resultado de la operación anterior fué: ',$resultado,'</p><hr/>';
     }
?>
<p>Indique el resultado buscado:</p>
<form method="get">
      <input type="submit" name="submit" value="Funciona" /> &nbsp; <input type="submit" name="submit" value="No funciona" />
</form>
<hr />
<p>El valor del contador es: <?php echo $_SESSION['contador']; ?> </p>
<hr />
<pre>
<?php highlight_file('NoDuplicados.php'); ?>
</pre>
</body></html>