Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => PHP => Mensaje iniciado por: exploiterstack en 16 Enero 2015, 11:51 AM

Título: [Resuelto] Alternar dos banners en cada refresco de la página
Publicado por: 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!
Título: Re: Alternar dos banners en cada refresco de la página
Publicado por: #!drvy en 16 Enero 2015, 14:22 PM
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
Título: Re: Alternar dos banners en cada refresco de la página
Publicado por: MinusFour en 16 Enero 2015, 18:04 PM
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.
Título: Re: Alternar dos banners en cada refresco de la página
Publicado por: exploiterstack en 19 Enero 2015, 08:31 AM
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! ;)