PDA

Ver la versión completa : php problema contador mysql



bluescreen
07-05-2012, 16:17
Hola tengo un contador que cada vez que hago click en un boton html me lleva a una pagina php y me modifica un campo en una tabla de la base de datos. El problema es que a veces en lugar de sumar 1, me suma dos. Sabeis que puede ser?

$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);


he probado clearstat(), mysql_free_result(), mysql_close()

si hago click en el boton y espero unos segundos hasta el proximo click, funciona bien.

SxR
12-05-2012, 11:21
Prueba a añadir al final (o al principio):

$calculo = 0;
mysql_close();

bluescreen
15-05-2012, 12:49
ya lo probe y tampoco funciono. el tema es que antes del update habia otro insert a otra tabla que tenia un campo del mismo nombre que tambien sumaba 1, y daba la impresion de que no liberaba la memoria y volvia a sumar otro 1 . He quitado el insert como solucion hasta que encuentre que es lo que pasa. muchas gracias.

hystd
05-06-2012, 23:42
¿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:



<?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:


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.

bluescreen
08-06-2012, 11:43
Hola muchas gracias por darme mas ideas. Voy a mirar lo de variable de session y tambien lo de bloquear tablas. Lo de automatizar el proceso puede ser buena idea tambien. Es algo que de momento lo he dejado apartado pero antes o despues puede que lo quiera arreglar. Gracias otra vez!