Foros del Web » Programando para Internet » PHP »

Insercion erronea

Estas en el tema de Insercion erronea en el foro de PHP en Foros del Web. Hola a todos! He buscado en el foro y he encontrado un tema parecido pero no lo he conseguido solucionar, se trata de una inserción ...
  #1 (permalink)  
Antiguo 17/04/2004, 02:05
 
Fecha de Ingreso: abril-2004
Mensajes: 6
Antigüedad: 20 años
Puntos: 0
Insercion erronea

Hola a todos!

He buscado en el foro y he encontrado un tema parecido pero no lo he conseguido solucionar, se trata de una inserción en mysql utilizando db_mysql.inc un tanto extraña, estoy haciendo una web en la que cada vez que un usuario inicia en el sistema es registrado en la base de datos, según su ip, fecha, etc., el problema viene porque a veces me hace una inserción duplicada, pero sin embargo solo se ejecuta una vez la orden de insercion porque lo he comprobao con echos, no se que puede fallar , ademas a veces inserta doble y otras no, no he conseguido determinar cuando pasa , el codigo es el siguiente:

$sql= "select count(id)'c_id' from ". $this->nombreTabla ." where usuario = ".$this->id_usuario." and inicio_correcto = -1 and fecha > '".$this->fecha_ant ."'";
$this->query($sql);
if (!$this->next_record()) return -1;

GLOBAL $INTENTOS;

if( ($this->f("c_id")) >= ($INTENTOS-1))
{
// es necesario el bloqueo de la cuenta
$usuario = new Usuario();
$usuario->setId($this->id_usuario);
$usuario->bloqueaUsuario();
}

if ((isset($this->id_usuario)) && ($this->id_usuario >= 0) && (isset($this->fecha)))
{
$this->query("INSERT INTO ". $this->nombreTabla ." (id, usuario, fecha, host, inicio_correcto) VALUES (NULL, ". $this->id_usuario .", '". $this->fecha ."', '". $this->ip ."', -1)");
}
else
{
$ret = -1;
$this->error = "Valores incorrectos para la inserción de la sesión";
}
return $ret;


espero q con ese trozo de codigo sea suficiente, la funcion bloquea usuario de la clase usuario no realiza ninguna insercion, cualquier ayuda sera bien recibida , muchas gracias por adelantado
  #2 (permalink)  
Antiguo 19/04/2004, 07:03
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
en PHP los nombres de "archivos" que puedan contener funciones u objetos (es tu caso) para controlar algún tema como el de una capa de abastracción de BD para Msyql al menos como el que usas no suelen decir nada .. Así que para esos casos deberías indicar el código completo (o donde está) para verlo y saber como funciona dicho objeto y sus métodos . .por qué tal vez el problema sea de mal uso del mismo (del objeto y sus métodos) y si no se vé como trabaja dicho objeto (manual, tutorial? código?) poco se puede hacer.


Por lo demás .. en tu código de ejemplo se hacen mención a otras tantas variables y funciones que no se vé el código .. Tampoco indicas el proceso por el cual pruebas dicho código .. algo tipo: tal página inicia ese código -> lo ejecuta -> de ahí pasa a no se donde .. y tal vez recarga la página? ..

En fin .. cuando se hacen preguntas que usan classes, funciones y cierta lógica .. si no se aportan más datos sobre el problema no se puede uno aventurar a dar alguna respuesta salvo el tìpico "mira aquí .. podría ser allá".


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 19/04/2004, 14:18
 
Fecha de Ingreso: abril-2004
Mensajes: 6
Antigüedad: 20 años
Puntos: 0
umm es verdad, es q llevo ya un tiempo con el codigo este y pensaba q estaria claro ya con eso, de todas formas tengo mucho codigo ya hecho y seria un poco lio para alguien q lo ve desde fuera, solo era para saber si alguien le habia pasado algo parecido, cuando puse el post ya imaginaba q el error vendria de la linea de:

$this->query("INSERT INTO ". $this->nombreTabla ." (id, usuario, fecha, host, inicio_correcto) VALUES (NULL, ". $this->id_usuario .", '". $this->fecha ."', '". $this->ip ."', -1)");


el metodo query simplemente es el metodo original de la clase db_mysql (q viene por herencia), se me olvido ponerlo en el mensaje anterior. Despues de poner el post e intentar ver porque a veces una conexion era registrada de forma duplicada y otras veces no he llegado a encontrar una solucion y la verdad q muy curiosa: el 100 % de las veces (que han sido muchas por cierto) que he probado el codigo en un cliente mozilla ha funcionado correctamente (registrando cada acceso una sola vez), al contrario de lo q sucede con internet explorer que suele registrar dobles los registros, curioso

saludos
  #4 (permalink)  
Antiguo 19/04/2004, 14:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Revisa las peticiones que se hacen a tu script. Los duplicados no se producen por ejecución del script en sí (al parecer) sino por llamadas consecutivas de ese script por el URL.

Como ya te deciá .. sin ver todo el código en su contexto es dificil ver el proceso del mismo .. y si dices que es largo y lleno de objetos y demás . .poco vamos a ver en un mensaje del foro sin poder probarlo (cosa que tu si que puedes hacer y evaluar).

Lo primero sería descartar problemas con la lógica del código ...

Lo más que se me ocurre es que si haces algún:

header("Location: nose.tal");

(un redireccionamiento) ..

Uses un exit; a continuación de dicho redireccionamiento ..por qué dependiendo del código (flujo) del mismo .. es probable que por ahí esté sucediendo el problema ya que dicha cabecera HTTP le indica al navegador que cambie la página que está viendo el cliente .. pero el flujo PHP del código se ejecuta hasta el final.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 20/04/2004, 15:29
 
Fecha de Ingreso: abril-2004
Mensajes: 6
Antigüedad: 20 años
Puntos: 0
hola cluster, gracias por la recomendacion, lo he probado y no es eso, estoy empezando a pensar por dejarlo por imposible, porque el hecho de que funcione perfectamente en mozilla pero en internet explorer no, me mosquea bastante, de todas formas el codigo que mencionas de los header es el siguiente:

f( $opcion == 'validarinicio' ){

$id = $usuario->idUsuario($HTTP_POST_VARS['login']);
$usuario->setId($id);


if ($id != -1)
{
$ret = $sesion->validarSesion ($id, $HTTP_POST_VARS['login'], $HTTP_POST_VARS['password'], $HTTP_SERVER_VARS['REMOTE_ADDR']);

if (($ret!= -1) && ($ret!= -2))
{
if ($ret == 1)
{ // inicio administrador session_cache_limiter('nocache,private');
session_start();
$HTTP_SESSION_VARS['tecaladminid'] = $id;
$HTTP_SESSION_VARS['login'] = $HTTP_POST_VARS['login'];
$HTTP_SESSION_VARS['ult_ini'] = $usuario->ultAcceso();
header("Location: ../admin.php");
}
else
{
// inicio de usuario convencional session_cache_limiter('nocache,private');
session_start();
$HTTP_SESSION_VARS['id'] = $id;
$HTTP_SESSION_VARS['login'] = $HTTP_POST_VARS['login'];
$HTTP_SESSION_VARS['ult_ini'] = $usuario->ultAcceso();
header("Location: ../usuario.php");
}
}
else
{ // inicio incorrecto
if ($ret == -1)
{ // ha accedido de forma incorrecta más de una vez en los ultimos 15 minutos

header("Location: ../error_ini.php?error=".$sesion->getError());
}
else
{ // es la primera vez en los ultimos quince minutos que accede incorrectamente
// se le indica el procedimiento de recordatorio de la contraseña
header("Location: ../error_ini.php?p=1&error=".$sesion->getError());
}
}
}
else
{ // no existe el usuario en el sistema
$sesion->setError("No existe el usuario en el sistema.");

header("Location: ../error_ini.php?error=".$sesion->getError());
}
}


aqui no se ve nada bien, de todas formas gracias por tus comentarios. Un saludo
  #6 (permalink)  
Antiguo 20/04/2004, 15:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
aqui no se ve nada bien, de todas formas gracias por tus comentarios
(usa el botón "PHP" para poner código .. así se verá coloreado ..

Y .. te insisto, haces muchos header("location ...) no he seguido la lógica de los mútiples if () else que tienes .. pero sería altamente recomendable (no te cuesta nada) poner un exit; tras cada header("Location ...")


Otro detalle ..

Veo que usas sesiones, y que redireccionas (con el header (location ..) ) sin propagar el SID .. así que deduzco que propagas el SID en cookies. Si es así, ten presente que necesitas un navegador que acepte cookies para que tu SID se propague.

Tambien es recomendable que uses los arrays superglobales (si uas PHP 4.1.0 en adelante) en lugar de los que usas .. es decir, usar: $_SESSION ...



Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 20/04/2004 a las 15:52
  #7 (permalink)  
Antiguo 21/04/2004, 14:30
 
Fecha de Ingreso: abril-2004
Mensajes: 6
Antigüedad: 20 años
Puntos: 0
ya probe lo de exit y no era eso, volvia a suceder el fallo, lo que pasa que al no ver que afectaba los exit al funcionamiento del sistema los quite para que el script termine en un unico punto, es una mania , no me habia fijado en lo de colorear el codigo con el boton de php, lo tendre en cuenta la proxima vez, lo de las sesiones si que utilizo cookies, la verdad que he preferido hacerlo asi por sencillez, porque total la mayoria de navegadores permiten cookies, lo que si que revisare sera lo de utilizar $_SESSION , una pregunta, queria dar a esta pagina de algo de seguridad, he utilizado encriptacion md5 para el login desde el cliente, secure mode de php, permisos de directorios, bloqueo de usuarios, proteccion contra ataques de inyeccion de sql y unicode, y tendre previsto utilizar https si todo sale bien, me podrias indicar alguna caracteristica mas a parte de estas que podria tener en cuenta?, gracias por tu ayuda cluster , un saludo
  #8 (permalink)  
Antiguo 21/04/2004, 15:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues .. sólo que eso .. cuanto antes puedas usa SSL para que los datos entre tu cliente y servidor viajen encriptados ..

Y sobre todo usar los arrays supergloables .. y register_globals a OFF .. con eso le das un "toque" más de seguridad a tus aplicaciones.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 22/04/2004, 10:21
 
Fecha de Ingreso: abril-2004
Mensajes: 6
Antigüedad: 20 años
Puntos: 0
ok lo tendre en cuenta, muchas gracias por todo cluster, un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:17.