¿Cuantos segundos tienes que esperar para que puedas garantizar en cierta medida que no se cuenta dos (o más) veces?
Si automatizases el proceso, por ejemplo con con herramientas del tipo Selenium IDE, BadBoy, etc... reduciendo al orden de milisegundos la ejecución (pulsación del botón), ¿También inserta el valor de 2? Haz la prueba...
Tal vez sea un problema de concurrencia. Si es así, en PHP puedes establecer una bandera global, guardada por ejemplo como un elemento en el array $_SESSION, de forma que mientras esa bandera esté activa, no se realice ninguna operación. Cuando la operación en curso finalice, desactivas la bandera, de forma que cualquier otra petición a esa página ya pueda hacerse efectiva:
Código:
<?php
session start();
if ($_SESSION["bandera]"==1){
}else{
$_SESSION["bandera"]=1;
$conexion = mysql_connect("localhost", "usuario", "contraseña");
mysql_select_db("basedatos", $conexion);
$query = "SELECT num FROM visitas WHERE idvisita = 1";
$resultado = mysql_query($query, $conexion);
$fila = mysql_fetch_array($resultado);
$numero = $fila['num'];
$suma = '1';
$calculo = $numero + $suma;
$query = "UPDATE visitas SET num = $calculo WHERE idvisita= 1";
$resultado = mysql_query($query, $conexion);
$_SESSION["bandera"]==0;
}
?>
Otra opción, es que puedes aprovechar y bloquear la tabla en la que haces el UPDATE, de forma que cualquier otra consulta UPDATE sobre esa tabla no se efectuará hasta terminar la transacción actual. Esto lo puedes hacer con la consulta de MySQL:
Código:
LOCK TABLE visitas WRITE;
-- para bloqueo en un acceso de escritura (UPDATE, INSERT o DELETE)
LOCK TABLE visitas READ;
-- para bloqueo en un acceso a lectura de esa tabla (SELECT).
-- y para desbloquear dicho bloqueo:
UNLOCK TABLE visitas;
Un saludo.
Marcadores