Foros del Web » Programando para Internet » PHP »

Problema con $_SESSION y firefox

Estas en el tema de Problema con $_SESSION y firefox en el foro de PHP en Foros del Web. Hola que tal, estoy teniendo un problema con un contador que estoy haciendo para un carrito de compras en php. Estoy declarando una variable en ...
  #1 (permalink)  
Antiguo 17/09/2008, 22:24
 
Fecha de Ingreso: septiembre-2008
Mensajes: 21
Antigüedad: 15 años, 7 meses
Puntos: 1
Exclamación Problema con $_SESSION y firefox

Hola que tal, estoy teniendo un problema con un contador que estoy haciendo para un carrito de compras en php.
Estoy declarando una variable en session que se aumenta al visitar cierta pagina para contar el numero de productos comprados, el problema que se me presenta es que en IE y Chrome va sumando de 1 en 1 como es debido, pero en Firefox me suma de 2 en 2....
Ya cheque que las sesiones no esten duplicadas.
Alguien sabe de esto?

Código PHP:
if(!isset($_SESSION['cart'][$art])){
    
$_SESSION['cart'][$art] = 1;
} else {
    
$_SESSION['cart'][$art]++;
}
echo 
$_SESSION['cart'][$art]; 
La variable $art es dada por $_GET['art']
El resultado que me imprime en Firefox es...
1,3,5,7,9... etc
Y en IE
1,2,3,4,5... como debe de ser
Esto cada vez que accedo a la pagina o la refresco con f5
Gracias!
  #2 (permalink)  
Antiguo 18/09/2008, 02:47
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con $_SESSION y firefox

Prueba a comprobar cuantas veces se carga la página. Por ejemplo, escribiendo en un fichero el valor de microtime.
  #3 (permalink)  
Antiguo 18/09/2008, 10:06
 
Fecha de Ingreso: septiembre-2008
Mensajes: 21
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Problema con $_SESSION y firefox

La pagina solo se esta cargando una sola vez, por lo que me han dicho esto es un problema comun y especifico de firefox. Agradesco cualquier solucion
  #4 (permalink)  
Antiguo 18/09/2008, 14:01
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con $_SESSION y firefox

Te preguntaba cuántas veces se cargaba la página porque yo me he encontrado con un caso parecido. Sólo pasa con Firefox y se me carga la página dos veces. Empecé a comentar código para ver el origen y llegué a un punto que, la verdad, me dejó igual ya que no tenía sentido alguno.
Yo pienso que es un bug de Firefox. De todas formas, ¿que es lo que te han comentado?
Me gustaría saber mucho cual es el origen del comportamiento.
  #5 (permalink)  
Antiguo 19/09/2008, 12:48
 
Fecha de Ingreso: septiembre-2008
Mensajes: 21
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Problema con $_SESSION y firefox

No supieron decirme cual es el error exactamente, yo tambien supuse que era un error de doble carga por lo que vi en los registros etc. He buscado en google por una respuesta pero al parecer no hay nada concreto, aun así lo resolvi dandole un poco de vueltas al codigo y haciendo la suma un tanto tosca.
Aun así, si me entero que es lo que lo hace, te lo hago saber
Gracias
  #6 (permalink)  
Antiguo 19/09/2008, 13:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con $_SESSION y firefox

Hola ghesent,

Usas de casualidad Firebug?

Saludos.
  #7 (permalink)  
Antiguo 20/09/2008, 13:09
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con $_SESSION y firefox

Cita:
Iniciado por ghesent Ver Mensaje
No supieron decirme cual es el error exactamente, yo tambien supuse que era un error de doble carga por lo que vi en los registros etc. He buscado en google por una respuesta pero al parecer no hay nada concreto, aun así lo resolvi dandole un poco de vueltas al codigo y haciendo la suma un tanto tosca.
Aun así, si me entero que es lo que lo hace, te lo hago saber
Gracias
Entonces sí que te cargaba la página dos veces, no?

Tengo curiosidad por saber cómo hiciste la suma. Te importaría mostrar el código?
Cita:
Iniciado por GatorV Ver Mensaje
Hola ghesent,

Usas de casualidad Firebug?

Saludos.
Yo también utilizó el Firebug, GatorV. ¿Sabes algo que no sepamos?
  #8 (permalink)  
Antiguo 20/09/2008, 22:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con $_SESSION y firefox

Firebug (antes de la versión 1.2) tiene un "bug" que para capturar el contenido del URL y poder hacer un debug llama de nuevo a la pagina (esto es para poder ver el output) en las versiones nuevas de Firebug hay una notificación que al hacer el segundo request puede generar un error.

El tema es porque así esta diseñado el firebug, aunque ya para la próxima versión de Firefox incluyeron la forma de poder interceptar el contenido por las extensiones por lo que este problema no se suscitara más.

Saludos.
  #9 (permalink)  
Antiguo 21/09/2008, 01:28
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con $_SESSION y firefox

Genial! Gracias por la explicación!
  #10 (permalink)  
Antiguo 21/09/2008, 19:13
 
Fecha de Ingreso: septiembre-2008
Mensajes: 21
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Problema con $_SESSION y firefox

No no utilizo firebug, pero aqui esta el codigo final de como quedo el rollo este..
Código PHP:
if($art != "none" && $delete=="" && isset($art)){  //si si hay articulo y no se esta borrando        
        
if($_POST['opcion']!=""){
            if(
$_SESSION['opciones'][$art] == ""){  //si las opciones estan limpias (primer articulo del tipo)
                
$_SESSION['opciones'][$art] = $_POST['opcion'];
                if(
$_POST['cantidad'] == ""){
                    
$_SESSION['cart'][$art] = 1;
                } else if(isset(
$_POST['cantidad'])){
                    
$_SESSION['cart'][$art] = $_POST['cantidad'];
                }
            } else {
                
$strpos strpos($_SESSION['opciones'][$art],$_POST['opcion']);
                if(
$strpos !== false){
                    echo 
"Ya existe opcion";
                    
$op explode(",",$_SESSION['opciones'][$art]);
                    
$key array_search($_POST['opcion'],$op);
                    echo 
$key;
                    
$cart explode(",",$_SESSION['cart'][$art]);
                    
$cart[$key] = $_POST['cantidad'];
                    
$_SESSION['cart'][$art] = implode(",",$cart);
                } else {
                    
$_SESSION['opciones'][$art] .= ",".$_POST['opcion'];
                    if(
$_POST['cantidad'] == ""){
                        
$_SESSION['cart'][$art] .= ",1";
                    } else {
                        
$_SESSION['cart'][$art] .= ",".$_POST['cantidad'];
                    }
                }
            }            
        } else {
            if(
$_POST['cantidad'] == ""){
                
$_SESSION['cart'][$art] = 1;
            } else if(isset(
$_POST['cantidad'])){
                
$_SESSION['cart'][$art] = $_POST['cantidad'];
            }
        }
    } else if(
$delete != ""){
        if(
$_GET['opciones'] == ""){ //producto normal
            
unset($_SESSION['cart'][$delete]);
            unset(
$_SESSION['opciones'][$delete]);
        } else { 
//producto con opciones
            
$delopciones explode(",",$_SESSION['opciones'][$delete]);
            
$delart explode(",",$_SESSION['cart'][$delete]);
            
$keyop array_search($_GET['opciones'],$delopciones);
            unset(
$delopciones[$keyop]);
            unset(
$delart[$keyop]);
            
$_SESSION['opciones'][$delete] = implode(",",$delopciones);
            
$_SESSION['cart'][$delete] = implode(",",$delart);
        }        
    }
    
    if(
$_GET['update']==1){
        foreach(
$_POST as $index => $value){
            
$_SESSION['cart'][$index] = $value;
        }
    } 
  #11 (permalink)  
Antiguo 22/09/2008, 00:04
 
Fecha de Ingreso: septiembre-2008
Mensajes: 21
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Problema con $_SESSION y firefox

Pues bueno ahora me encuentro con otro problema con esto del firefox..
Las variables de $_SESSION cuando concatenas un string en base a post o a get a veces no lo hace?
Hay alguna forma de configurar estos errores directamente desde el codigo?

Código PHP:
if($strpos !== false){
                    
//echo "Ya existe opcion";
                    
$op explode(",",$_SESSION['opciones'][$art]);
                    
$key array_search($_POST['opcion'],$op);
                    
$cart explode(",",$_SESSION['cart'][$art]);
                    
$cart[$key] = $_POST['cantidad'];
                    
$_SESSION['cart'][$art] = implode(",",$cart);
                } else {
                    
//echo "No existe opcion";
                    
$_SESSION['opciones'][$art] .= ",".$_POST['opcion'];
                    if(
$_POST['cantidad'] == ""){
                        
//$_SESSION['cart'][$art] = $_SESSION['cart'][$art].",1";
                        
$artop $_SESSION['cart'][$art].",1";
                    } else {
                        
//$_SESSION['cart'][$art] = $_SESSION['cart'][$art].",".$_POST['cantidad'];
                        
$artop $_SESSION['cart'][$art].",".$_POST['cantidad'];
                    }
                    
$_SESSION['cart'][$art] = $artop;
                } 
La variable de $_SESSION['cart'][$art] deberia de escribir algo como "1,1,1" etc. Pero el problema es que la primera vez que se agrega un producto escribe "1" como es debido, despues entra al condicional que les pongo arriba.. De ahi, agrega el otro producto como "1,1" digamos, pero ya el tercero no lo agrega
y se queda en "1,1". Pienso que si puede estar cargando la pagina dos veces, pero que puedo hacer al respecto? Este problema se me ha estado presentando tanto abriendo la pagina con WAMP (local) asi como en servidor.

La verdad la unica opcion que estoy viendo a todo esto es basicamente borrar todo el codigo que he hecho y empezar de nuevo evitando cualquier contacto con $_SESSION pero por lo que eh visto este problema no es normal.
Alguien tiene una solucion?
  #12 (permalink)  
Antiguo 22/09/2008, 12:58
 
Fecha de Ingreso: septiembre-2008
Mensajes: 21
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Problema con $_SESSION y firefox

Bueno amigos al hacer unas pruebas encontre el problema..
Al parecer firefox, como comentaban antes, hace una doble carga de las paginas para la parte del codigo fuente, independientemente de si se usa firebug o no.
Entonces, el problema se presenta en que la segunda vez que la pagina se carga con una variable $_POST, esta ya no existe por lo que talvez lo mejor para utilizar variables importantes que van a interactuar con $_SESSION seria get, ya que esta si permanece.
Aun así, si se requiere el uso de $_POST lo mejor sera agregar algun tipo de contador rudimentario que no permita la doble carga de las variables.
Si alguien sabe de alguna forma mas sencilla de sortear este problema, porfavor compartanla porque esto me esta dando muchos dolores de cabeza.

Les comparto mi codigo para que vean como lo resolvi finalmente.

Código PHP:
if($art != "none" && $delete=="" && isset($art)){  //si si hay articulo y no se esta borrando        
        
if($_POST['opcion']!=""){ //articulo con opciones
            
$postOpcion $_POST['opcion'];
            if(
$_SESSION['cart'][$art][$postOpcion] == ""){  //si las opciones estan limpias (primer articulo del tipo)
                //$_SESSION['opciones'][$art] = $_POST['opcion'];
                
if($_POST['cantidad'] == ""){
                    
$_SESSION['cart'][$art][$postOpcion] = "1";
                } else {
                    
$_SESSION['cart'][$art][$postOpcion] = $_POST['cantidad'];
                }
            } else { 
//ya existe articulo, se esta modificando desde afuera
                
$_SESSION['cart'][$art][$postOpcion] = $_POST['cantidad'];
            }    
        } else if(
$_POST['opcion']=="" && count($_SESSION['cart'][$art])==0) {
            if(
$_POST['cantidad'] == ""){
                
$_SESSION['cart'][$art]['*'] = "1";
            } else if(isset(
$_POST['cantidad'])){
                
$_SESSION['cart'][$art]['*'] = $_POST['cantidad'];
            }
        }
    } else if(
$delete != ""){
        if(
$_GET['opciones'] == ""){ //producto normal
            
unset($_SESSION['cart'][$delete]);
        } else { 
//producto con opciones
            
$getOpciones $_GET['opciones'];
            unset(
$_SESSION['cart'][$delete][$getOpciones]);
        }        
    }
    
    if(
$_GET['update']==1){
        foreach(
$_POST as $index => $value){
            
$pos strpos($index,"-");
            if(
$pos === false){ //si no hay separador que indica opcion
                
$_SESSION['cart'][$index]['*'] = $value;
            } else {
                
$ex explode("-",$index);
                
$_SESSION['cart'][$ex[0]][$ex[1]] = $value;
            }
        }
    }
    
print_r($_SESSION['cart']);
?> 
Si ven la siguiente linea:
Código PHP:
} else if($_POST['opcion']=="" && count($_SESSION['cart'][$art])==0) { 
Tuve que agregar al if un contador de el array para ver que no se estuviera duplicando la recarga de la pagina
ya que me agregaba un articulo vacio y sin datos.

Última edición por ghesent; 22/09/2008 a las 13:00 Razón: Agregando explicacion
  #13 (permalink)  
Antiguo 23/09/2008, 01:42
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con $_SESSION y firefox

Yo implementé algo parecido a lo que explican aquí.

De todas formas, no me ayuda mucho porque, por ejemplo, yo vacío la variable de sesión que guarda los mensajes al cargar la página de un formulario. Como, a veces, se carga la página dos veces no se ven los mensajes.
  #14 (permalink)  
Antiguo 28/10/2008, 14:44
OeL
 
Fecha de Ingreso: octubre-2008
Mensajes: 3
Antigüedad: 15 años, 6 meses
Puntos: 0
Firefox SOLUCIONES - "doble-carga-pagina"

ATENCIÓN DESARROLLADORES WEB: FireFox puede ROMPER tu aplicación "del lado del servidor" (esto es nuevo). No es que el "cliente" no vea bien una página: es que el "programa en el servidor" empezará a funcionar raro, como si tuviera vida propia y ejecutara acciones por su cuenta.

Puede que algunos ya lo conozcáis (tema prefetching Firefox), aunque a mí me ha pasado hace poco ... y casi me vuelvo loco (y por lo que he visto así anda mucha gente) ... y es la cagada más enorme de la historia de los navegadores ... y es de Firefox (quién me lo iba a decir).

Empezamos:

Fíjate en este código php:

Código:
<?php
session_start();
echo $_SESSION['contador']++;
?>
¿Qué hace?
Cada vez que recargues la página verás un número, que será sucesivamente 1,2,3,4, etc

PERO en Firefox (y sólo en firefox) "a lo mejor" los números te salen así 1,3,5,7, ... contando de dos en dos.

Es como si cargara la página dos veces.

Al final descubres que Firefox (y sólo él) hace llamadas por su cuenta a otras páginas (o a la misma).

Carga la página que debe cargar y la muestra.
Pero además (a veces) hace una llamada a otra ... que no muestra ... pero la llamada queda hecha.

Y en una aplicación avanzada, que hace logs de acceso y tiene otros comportamientos, esto provoca el desastre (desde logs repetidos, a comportamientos erráticos -QUE TE VOLVERÁN LOCO-)

¿Cuándo hace eso Firefox?
Basta con que la página lleve esto:
Código HTML:
<link rel="next" href="...url..." /> 
(pon url la de la misma página)

Firefox hará una precarga de esa URL (o sea, una llamada al servidor)
Y CLARO en una aplicación web avanzada con punto de entrada centralizado ... provocará una reconstrucción de sessión, duplicación de logs y quién sabe que desastres (ya que se estarán ejecutando "acciones" que nadie ha pedido ... porque Firefox lo decide).

Tendrás en el "lado-servidor" un programa "ejecutando acciones" por su cuenta.

¿Por qué ocurre esto?
Por una "feature" de Firefox llamada "prefetching"

+++++++++++++++++++
VER INFO:
https://developer.mozilla.org/En/Link_prefetching_FAQ
+++++++++++++++++++

Algún listo pensó que Firefox podría "precargar" cosas para "ir más rápido" ... y han abierto la puerta de los infiernos, ya que hacer una llamada a una página en una aplicación web es sinónimo de ejecutar una acción (con lo cual comienzan a ejecutarse acciones sin que nadie las pida).

En tu navegador Firefox puedes desactivar el prefetching poniendo about:config, y cambiando network.prefetching-netx = false

Eso hará que Firefox vaya mejor (el colmo de los colmos encima).

PERO COMO WEBMASTER ¿CÓMO PROTEGERTE DE FIREFOX?

URGENTE:
¿CÓMO EVITAR ESTO COMO WEBMASTER?

Si tienes un punto de entrada a tu aplicación, pon esto al principio de todo (o ponlo en todas las páginas al principio)

Código:
<?php
if ( isset($_SERVER['HTTP_X_MOZ']) && $_SERVER['HTTP_X_MOZ'] == 'prefetch' ){
	ob_end_clean();
	header('HTTP/1.1 403 Prefetch Forbidden');
	die;
}
?>
¿Qué hace?
Detecta una cabecera enviada por firefox cuando hace prefetching, y evita que se ejecute nada en el servidor.

VIVIR PARA VER:
Ahora resulta que Firefox es el mayor KILLER potencial de las aplicaciones web avanzadas basadas en MVC (donde cada llamada es una "acción" en el sistema ... que puede interaccionar con DB, etc).

Saludos a todos ... y tomar buena nota.

Leo (www.netcentroseduca.net)
  #15 (permalink)  
Antiguo 28/10/2008, 21:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con $_SESSION y firefox

Creo el llamar KILLER de la web es demasiado sensacionalista, y no todos usan la misma, linea de next, ya que no es parte del estándar para web, simplemente con implementar la parte que dices para checar si viene por el prefetch basta para evitar los request simultáneos.

Saludos.
  #16 (permalink)  
Antiguo 29/10/2008, 04:20
OeL
 
Fecha de Ingreso: octubre-2008
Mensajes: 3
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Problema con $_SESSION y firefox

Corrigiendo a GatorV:

La etiqueta <link rel> es un estándar del W3C.

Yo la tenía porque en algunos validadores WAI-AAA exigía tenerlas (en otros no).

En cualquier caso es un gran peligro: Si un programa decide "cargar" páginas por su cuenta, estará ejecutando acciones en la aplicación (y si esas acciones hacen registros en sessión, database o ficheros, todo se vuelve loco).

Y CREO QUE ES MUY GRAVE: ¿O a tí te parece "normal" el tener que andar poniendo códigos preventivos en los programas para protegerse de esos comportamientos?

Es una gran cagada de Firefox ... la más gorda de todos los navegadores hasta la fecha.
  #17 (permalink)  
Antiguo 29/10/2008, 05:37
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Problema con $_SESSION y firefox

La idea del prefetch es buena. Los usuarios pueden navegar más rápido. Pero para los programadores, por lo que veo, resulta molesta.

Creo recordar que GatorV comentó en otro post que el Firebug realizaba un proceso que cargaba la página dos veces. No sé si se refería a esto o no. Si me lees, GatorV, me gustaría que me lo aclareses.

Un saludo.

Última edición por jerkan; 29/10/2008 a las 14:19 Razón: Error gramatical
  #18 (permalink)  
Antiguo 29/10/2008, 09:21
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con $_SESSION y firefox

Así es, como te comento todo depende y es más que nada al leer los request por AJAX para examinar el resultado, para Firefox 3.1 ya esta el parche listo para que no pase.

@OeL
La etiqueta <link> NO es necesaria, por favor documentante bien, solo es necesario el rel="" si usas el link ya que se usa para muchas cosas, por ejemplo importar un stylesheet externo, declarar un RSS feed de la pagina, la pagina siguiente etc.

Perfectamente puedes programar una pagina 100% valida bajo cualquier Doctype sin poner un solo <link> en el header.

Saludos.
  #19 (permalink)  
Antiguo 29/10/2008, 16:03
OeL
 
Fecha de Ingreso: octubre-2008
Mensajes: 3
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Problema con $_SESSION y firefox

Vamos a ver


la etiqueta

<link rel="next" href="...url.." />

no es necesaria ... vaya un descubrimiento qué has hecho ...

Tampoco es necesario poner una etiqueta <p> ... y tendrás una página perfectamente válida con párrafos o sin párrafos.

Lo que pasa es que tú has dicho antes que no es un "estándar" para web ... lo cual NO ES CIERTO ...porque si por "estándar" entendemos el código HTML aprobado por el consorcio W3C, entonces esa etiqueta es tan estándar como la etiqueta <p> <a> etc.

Pero eso no es el tema: El tema es que Firefox carge página por su cuenta.

¿Y si hiciera precarga de todos los <a href=url ...> que encuentre?

Pues sería el caos en los programas del lado servidor.

Y los que hacemos programas, tendríamos que bloquear ese comportamiento nefasto.

Saludos
  #20 (permalink)  
Antiguo 29/10/2008, 16:33
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema con $_SESSION y firefox

Te recomiendo leas la FAQ de Mozilla sobre el uso de Prefetch, también el estándar W3C sobre el uso de las etiquetas next/prev.

Con eso podrás ver Firefox no es un "MVC KILLER", ni mucho menos, solo esta siguien el uso definido por el estándar de la W3C que es recomendado cuando estas navegando un sitio.

Cuando entiendas para que sirven las etiquetas prev, next, podrás ver que firefox ni es un Killer ni nada, si no que se esta comportando a como TU le especificas en tu documento HTML.

Es como si pones un link a una pagina y el usuario hace click en el, vas a decir que todos los navegadores son KILLERS por que al seguir el link causaron algo en tu sistema? Documentate antes de hacer/decir cosas que no son

Saludos
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 20:02.