[Resuelto] Alternar dos banners en cada refresco de la página

Iniciado por exploiterstack, 16 Enero 2015, 11:51 AM

0 Miembros y 1 Visitante están viendo este tema.

exploiterstack

Hola quería que me ayudarais con el siguiente problema,

Resulta que quiero que al refrescar/cargar la pagina web me alterne dos imágenes banners de modo que en cada carga muestre una distinta.

Ojo no la quiero random ya que de ese modo lo consigo hacer(efecto que no deseo ya que a lo mejor cada dos, tres... refrescos me la alterna). Se me ocurre guardar un flag en la BD como valor a 1 de modo que si recargo de nuevo compruebo el valor, si es igual a 1 cargo el siguiente banner y lo pongo a 2 el flag y así al revés poniéndolo de nuevo a 1. Pero no querría legar hacer este procedimiento...

También quiero hacerla sin necesidad de utilizar metodos alternativos donde almacenar un estado como pueden ser: sesiones, cookies, ficheros, localstorage etc...

Espero vuestra respuesta, saludos!

#!drvy

#1
CitarTambién quiero hacerla sin necesidad de utilizar metodos alternativos donde almacenar un estado como pueden ser: sesiones, cookies, ficheros, localstorage etc...

Entonces... ¿ Como pretendes guardar el valor para que no sea random ? Guardar el flag en la BD es igual que guardarlo en un fichero.. es lo mismo de hecho.. Se me ocurre que quizás puedas modificar el nombre de la imagen.. pero es ineficiente y raro y ni me quiero imaginar el lio que crearía con mas de 10 requests simultáneos.

Código (php) [Seleccionar]
<?php

/**
 * Rotar entre varios banners sin guardar temporales.
 * @return [string] [El archivo a mostrar]
 */
function rotate_banner(){
    
$dir 'banners/';
    
$files = array('img_1.png','img_2.png');
    
$used 'used_';

    foreach(
$files as $i=>$file){

        
$_file $dir.$file;
        
$_used $dir.$used.$file;
        
$_new = array();

        if(!
file_exists($_file) && file_exists($_used)){

            
rename($_used$_file);

            if(
$i count($files)-1){

                
$_new['file'] = $dir.$files[$i+1];
                
$_new['used'] = $dir.$used.$files[$i+1];

            } else {

                
$_new['file'] = $dir.$files[0];
                
$_new['used'] = $dir.$used.$files[0];

            }

            
rename($_new['file'],$_new['used']);
            return 
$_new['used'];
        }
    }

    
rename($dir.$files[0], $dir.$used.$files[0]);
    return 
$dir.$used.$files[0];
}

echo 
'<img src="'rotate_banner(), '" alt="banner" />';

?>


Me imagino que se puede optimizar bastante pero es para mostrar la idea.

Saludos

MinusFour

Cita de: exploiterstack en 16 Enero 2015, 11:51 AM
Hola quería que me ayudarais con el siguiente problema,

Resulta que quiero que al refrescar/cargar la pagina web me alterne dos imágenes banners de modo que en cada carga muestre una distinta.

Ojo no la quiero random ya que de ese modo lo consigo hacer(efecto que no deseo ya que a lo mejor cada dos, tres... refrescos me la alterna). Se me ocurre guardar un flag en la BD como valor a 1 de modo que si recargo de nuevo compruebo el valor, si es igual a 1 cargo el siguiente banner y lo pongo a 2 el flag y así al revés poniéndolo de nuevo a 1. Pero no querría legar hacer este procedimiento...

También quiero hacerla sin necesidad de utilizar metodos alternativos donde almacenar un estado como pueden ser: sesiones, cookies, ficheros, localstorage etc...

Espero vuestra respuesta, saludos!

¿Y donde pretendes guardar la flag? El código de drvy tecnicamente escribe la flag en el nombre del archivo que no se escribe en el archivo per se (dependiendo del sistema de archivos) pero igual se guarda en algun lado. Incluso la Base de Datos guarda la informacion en algun lado (como te dijeron).

Puedes pasar la ultima imagen por una peticion HTTP pero es modificable:
Código (php) [Seleccionar]

<?php
$img 
= array('archivo1.jpg''archivo2.gif'); //array de imagenes
$max count($img);
if(isset(
$_GET["last"]) && is_numeric($_GET["last"]) && $_GET["last"] < $max){
   
$last $_GET["last"];
} else {
   
$last = -1//Cualquier valor de rand vale.
}

do {
 
$rand mt_rand(0,$max-1);
} while(
$rand == $last);

$img[$rand]; //imagen a desplegar


Tambien puedes hacer un desplegado en base al tiempo, pero no hay garantía que no se repita la imagen.

Código (php) [Seleccionar]

<?php
$img 
= array('archivo1.jpg''archivo2.gif'); //array de imagenes
$max count($img);
$step '10'//10 segundos.

$time time();
$ip ip2long($_SERVER["REMOTE_ADDR"]);

$seed $time $ip;
$hash floor($seed % ($step $max) / $step);
$img[$hash]; //imagen a desplegar;
?>


Lo único es que si la persona hace el refresco de la pagina antes de lo que hayas puesto en $step, se muetra la misma imagen.

exploiterstack

Muchísimas gracias #!drvy, me ha funcionado a la perfección. Y a ti MinusFour también gracias por el consejo, nunca viene mal saber otras alternativas.

Un saludo! ;)