No estás registrado (Registrarse)

Vanilla 1.1.10 es un producto de Lussumo. Para más información: Documentación, Soporte.

    •  
      CommentAuthorGintoni
    • CommentTimeJul 26th 2011 editado
     # 1
    Quiero hacer que una función de php se active solo por sesión de usuario, supongo que el tema se hace via coockie.


    La función hace que el usuario cada vez que entre en la web tenga un fondo diferente de color. la función es esta:

    function random_bg() {
    $bgs = array ('5A5B5C', '628299', '5D3269', '88476C');
    $n = rand( 0, count($bgs)-1);
    echo $bgs[$n];
    }

    La llamada en el header es la siguiente:

    <body <?php body_class(); ?> style="background-color:#<?php random_bg();?>">


    Ahora lo que hace es que cada vez que cambia de pagina cambia de color, y la intención es que cada vez que un usuario entre en la web tenga un color diferente, pero que durante toda esa sesión se le mantenga el mismo color, hasta que otro día vuelva a entrar y tenga otro color. Necesito un poco de ayuda para acabarlo de desarrollar, es la primera vez que me meto en algo con sesiones y ando muy pez.

    Cualquier pista se agradece.
    •  
      CommentAuthorPedro
    • CommentTimeJul 26th 2011 editado
     # 2
    Prueba a modificar la función asi:


    function random_bg() {
    @session_start();
    if(!isset($_SESSION["fondo"])) {
    $bgs = array ('5A5B5C', '628299', '5D3269', '88476C');
    $n = rand( 0, count($bgs)-1);
    $_SESSION["fondo"]=$bgs[$n];
    }
    echo $_SESSION["fondo"];
    }
    Pedro.com.es · Patentados.com
    • CommentAuthorproph
    • CommentTimeJul 27th 2011
     # 3
    Posted By: PedroPrueba a modificar la función asi:


    Eso no funcionaría porque el session start es la primera línea de código que se tiene que ejecutar. Puedes ponerla o bien fuera de la función o bien cambiar el ECHO por un RETURN y en la primera línea guardar la variable fondo.

    Si no me equivoco claro... :wink:Mis cosas: Intercambio de enlaces | Tienda de setas
    •  
      CommentAuthorGintoni
    • CommentTimeJul 27th 2011
     # 4
    Gracias Pedro, proph

    no he sabido hacerlo funcionar, sigue cambiando de color cada vez que cambio de pagina, he probado borrar la sesión en el navegador y tampoco ha funcionado.


    Voy a ver lo que comentas proph, a ver si me rula ahora.
    • CommentAuthorepsilon
    • CommentTimeJul 27th 2011
     # 5
    proph tiene razón pon el @session_start(); fuera de la función y lo pones como primer linea de código de ámbito global???

    Desde ya es contradictorio iniciar una sesión en el ámbito de una función ya que las sesiones por definición son globales.Disclaimer: Por lo menos así lo veo yo. Y cambiando de tema, recomiendo jugar Ajedrez por email
    •  
      CommentAuthorGintoni
    • CommentTimeJul 27th 2011
     # 6
    La verdad es que si !!!

    Finalmente me funciona de la manera que dice proph

    He puesto lo de la session fuera de la función y parece que de momento funciona bien. Lo que me ha ocurrido, es que al borrar la sesión activa en el navegador y volver a empezar sesión me ha vuelto a pillar el color anterior, como si no hubiera cambiado. Pura casualidad del random imagino.


    Gracias a todos. Demene Powaaaa !! :clap:


    @session_start();

    function random_bg() {

    if(!isset($_SESSION["fondo"])) {
    $bgs = array ('5A5B5C', '628299', '5D3269', '88476C');
    $n = rand( 0, count($bgs)-1);
    $_SESSION["fondo"]=$bgs[$n];
    }
    echo $_SESSION["fondo"];
    }
    •  
      CommentAuthorPedro
    • CommentTimeJul 27th 2011
     # 7
    Es verdad que es más correcto iniciar la sesión al comienzo de la página, pero yo la verdad es que a veces suelo trabajar así, casi por gandulismo de no subir al principio del script, inicio la sesión antes de accederla por primera vez, donde me pille. Y no veo problema en lanzar el start dentro de la función, la sesión se iniciará, sin influirle el ámbito, al ser una superglobal. De hecho a mi me funciona el script, pero asumo es más correcto pasar el @session_start(); al principio.

    Si lo estás haciendo en un server en producción, prueba a ponerle al principio estas sentencias, para poder ver los posibles mensajes de error:

    error_reporting(E_ALL);
    ini_set('error_reporting', E_ALL);
    Pedro.com.es · Patentados.com
    •  
      CommentAuthorPedro
    • CommentTimeJul 27th 2011
     # 8
    Posted By: GintoniFinalmente me funciona de la manera que dice proph


    Ah vale ya olvida lo que te sugería :) me alegro que se solucionaraPedro.com.es · Patentados.com
    •  
      CommentAuthorGintoni
    • CommentTimeJul 27th 2011
     # 9
    Posted By: PedroAh vale ya olvida lo que te sugería :) me alegro que se solucionara


    Gracias Pedro, tu me habías puesto en la pista correcta, y entre todos ha salido como esperaba.

    Saludos,