Foros del Web » Programando para Internet » PHP »

frase aleatoria que no se repita

Estas en el tema de frase aleatoria que no se repita en el foro de PHP en Foros del Web. Hola a tod@s. Verán, quisiera hacer que en mi web se visualizara cada día una frase célebre con su autor, las cuales tengo guardadas en ...
  #1 (permalink)  
Antiguo 12/02/2007, 18:30
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Pregunta frase aleatoria que no se repita

Hola a tod@s.
Verán, quisiera hacer que en mi web se visualizara cada día una frase célebre con su autor, las cuales tengo guardadas en una base de datos.
En principio me gustaría que aparecieran aleatoriamente, pero que no se repitieran al menos en un número determinado de días. Es decir, que no salga hoy una y mañana o pasado de nuevo la misma, sino que de repetirse fuera tras un mes por ejemplo. Aunque si tuviera que mostrarlas en orden tampoco pasaría nada.
El caso es que cuando lo pensé me pareció todo muy bonito, que facil, una tabla con dos campos... pero ay amigo que me he puesto a escribir y no he tenido ni por donde empezar

Para empezar no sé en que momento tengo que hacer que se cambie la frase del día por la del día siguiente.

Luego no sé como seleccionar la frase con las condiciones que he explicado. He leido algo de la función rand(), pero eso no me asegura que las frases no vayan a repetirse muy rápido.
He pensado en añadir un campo fecha y que la consulta solo seleccione las de hace x días o más, pero tampoco sé como hacer eso

Alguien puede darme alguna pistita de por donde empezar para poder al menos buscar información un poco más orientada? Porque después de pasarme un buen rato leyendo y buscando cada vez estoy más liada

Por cierto. Asumo que es con php por la base de datos pero tampoco estoy segura que no tenga que usar javascript en algún momento por aquello de las horas de cada usuario... ays madre donde me he metio
Bueno muchas gracias por adelantado a los que puedan y quieran ayudarme
  #2 (permalink)  
Antiguo 12/02/2007, 23:01
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 20 años, 4 meses
Puntos: 17
Re: frase aleatoria que no se repita

Se me ocurre de la Siguiente Manera. (Talvez un poco enredada, pero debe funcionar).

Una tabla config con el siguiente parametro
id|mes_actual|numero_dia|frase_diaria

Esta tabla vasta que tenga un solo registro, ya que mes_actual siempre va a tener el mes en curso, numero_dia va a tener el numero del dia en curso y frase_diaria va a tener el id a la frase del dia.

La tabla de las Frases Celebres
id|titulo|frase|autor|repeticions_en_el_mes|
Esta tabla va a tener todos los registros de tus frases, inicialmente el campo repeticiones_en_el_mes debe ser int y como default 0.

------------------------------------------
Ahora viene lo bonito

En tu Script principal del Sitio, debes tener esto (Esta en Pseucodigo), La idea esque se entiende lo que tienes que hacer, para que tu lo realizes
Código PHP:
<?
/* Conexion Mysql y Extremos los Datos de la Tabla Config*/

$mes_actual=date("n",time());
$num_dia_actual=date("t",time());

// Vemos el Mes
if (  $mes_actual != $mes_en_config )
{
    
// Si el Mes es distinto, quiere decir que cambiamos de Mes
    // Tenemos que reiniciar repeticiones_en_el_mes a 0 en la Tabla Frases
    
    // Y actualizar el mes de la Config
    
}

if ( 
$num_dia_actual != $num_dia_en_config  )
{
    
// Son distintos, es decir estamos en un Nuevo Dia
    // Debemos Selecionar al Azar la Nueva Frase, pero con la condicion
    // que repeticiones_en_el_mes sea 0
    
$sql="SELECT * FROM frases WHERE repeticiones_en_el_mes=0";
    
$select $mysql->query($sql);
    
$i=0;
    while ( 
$row $mysql->f_array$select ) )
    {
        
$frases[$i]=$row;
        
$i++;
    }
    
// Finalmente en $frases tenemos una matriz con todas las frases con al doncion de repeticiones_en_el_mes = 0
    
$frase_selecionada=$frases[rand(0,(count($frases)-1))];
    
// Y hemos selecionado una Frase al Azar
    // ---- Ahora debemos actualizar el id de la frase en la Tabla Config con el $frase_selecionada['id']
    
    // ---- Actualizar el Dia del Mes en la Tabl Config
    // ---- Aumentar el Contador de la Frase en la Tabla Flases
    
    
    
    
}
?>
Explicacion
En la Tabla Config Tenemos los Datos del Mes Actual, Dia Actual y Frase Diaria, si detectamos que cambio el mes, reiniciamos todos los contadores de todas las frases, si detectamos que cambio el dia, debemos selecionar una nueva frase con la condicion que repeticiones_en_el_mes sea 0 , ya selecionada una al azar, a esta debemos incrementarle su contador

Entonces el mismo Script va a updateamos fechas, eligiendo frases no selecionadas, etc etc ...

Finalmente en tu Sitio, debemos mostrar la Frase que del id alojado en frase_diaria en la Tabla Config


Ojala te Sirva.
PD : Esta en pseudocodigo, la misma consulta sql esta incomplenta (ya que utilizo una clase para ello), Lo importante es la idea para el problema


Saludos
  #3 (permalink)  
Antiguo 13/02/2007, 09:59
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Re: frase aleatoria que no se repita

Muchas gracias Deer por tu respuesta. Tengo que analizarla bien a fondo porque suele costarme un poquito entender estas cosas
No obstante entiendo que para hacer el cambio de la frase, todo depende de la tabla con la fecha actual verdad? es decir cuando la página se carga, si la fecha que recoge ya no es la misma que hay en la base de datos, se cambia la frase y se cambia la fecha en dicha base. Entendí bien??

Lo de seleccionar la frase tambien voy a verlo bien, ahi si creo que me lié un poco más pero seguro que lo entenderé, que cuando me pongo cabezona...
Ayer después de preguntar todavía seguí erre que erre con el asunto y llegué a esto, pero no sé si está muy bien la verdad
Se supone una tabla frases con los campos frase, autor y publicada (fecha en que se publicó la última vez)
y hago esto:

Código PHP:
    $fecha=getdate(); //fecha actual
    
$hoy=$fecha['year'].'-'.$fecha['mon'].'-'.$fecha['mday'];  //fecha actual formateada aaaa/mm/dd
    
$dias=30//días que deben haber transcurrido como mínimo para publicar otra vez una frase

    
$publicada=date("Y-m-d",strtotime("$hoy-$dias day")); //calculo la fecha mínima de las frases que pueden volver a ser publicadas

    
$consulta="select * from frases where publicada <".$publicada."order by rand()";  //selecciono una frase al azar siempre que la fecha sea menor que la establecida como mínima
    
$resultado=mysql_query($consulta);
    while (
$filas=mysql_fetch_array($resultado)){
        echo 
$filas["frase"]."<BR>";
        echo 
$filas["autor"]."<BR>";

        
//aquí cambiaría la fecha de la frase, pero aún no he llegado
    

Creo que tengo que ponerle algún parámetro a Rand para que solo seleccione 1 y en vez de un while usar un if, pero para probar estaba viendo que me seleccionaba todas las que tenían fecha inferior a la que quería y no seleccionaba las otras. pero en general... estaría bien?? Porque así en caso de tener muchas frases podría ampliar el periodo y si tengo pocas disminuirlo con solo cambiar $dias
Y si lo hiciera así igualmente podría utilizar la parte de la tabla con la fecha que se compara con la actual para hacer el cambio verdad???
Sorry que sea tan preguntona, es que estoy bastante verde con el php y la forma que tengo de que me salga es intento-fallo y ya donde no sé seguir dar la barrila a los que saben :P
Mientras voy a probar a ver que pasa... mientras el ordenador no explote vamos bien

Gracias otra vez
  #4 (permalink)  
Antiguo 13/02/2007, 14:28
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Re: frase aleatoria que no se repita

Bueno al final cogiendo de acá y de allá he conseguido algo que en principio parece funcionar A ver que les parece

Tengo estas dos tablas: fecha (id, dia, frase); y frase (id, frase, autor, publicada)

Código PHP:
//Me conecto a la base de datos y...
//COMPROBAR SI HA CAMBIADO EL DÍA O ES EL MISMO:

    
$dia_hoy=date("d",time()); // recojo el día de hoy
    
$consulta=mysql_query("select * from fecha"); //selecciono el contenido de la tabla fecha
    
$resultado=mysql_fetch_array($consulta); 

    if(
$dia_hoy!=$resultado["dia"]){ //si el día recogido es distinto del que hay en la base de datos, es otro día, buscamos otra frase

        //SELECCIÓN DE FRASE

        
$fecha=getdate(); //fecha actual
        
$hoy=$fecha['year'].'-'.$fecha['mon'].'-'.$fecha['mday'];  //fecha actual formateada aaaa/mm/dd
        
$dias=30//días que deben haber transcurrido como mínimo para publicar otra vez una frase (así pienso que es más facil variarlo como comenté antes)

        
$publicada=date("Y-m-d",strtotime("$hoy-$dias day")); //calculo la fecha mínima de las frases que pueden volver a ser publicadas

        
$consulta="select * from frases where publicada <'".$publicada."' order by rand() limit 1";  //selecciono una frase al azar siempre que la fecha sea menor que la establecida como mínima

        
$resultado=mysql_query($consulta);
        
$filas=mysql_fetch_array($resultado);


        
mysql_query("update frases set publicada='".$hoy."' where id=".$filas['id']); //actualizo la fecha de la frase seleccionada.

        
mysql_query("update fecha set dia=".$dia_hoy.", frase=".$filas["id"]." where id=1"); //actualizo el día y la frase en la tabla fecha

    
}else{ //si el día recogido es el mismo que está en fecha, seguimos en el mismo día, y la frase no cambia
        
$consulta="select * from frases where id=".$resultado["frase"];
        
$resultado=mysql_query($consulta);
        
$filas=mysql_fetch_array($resultado);
    }

    echo 
$filas["frase"]."<BR>";
    echo 
"(".$filas["autor"].")<BR>"
  #5 (permalink)  
Antiguo 13/02/2007, 16:42
 
Fecha de Ingreso: septiembre-2006
Ubicación: Buenos Aires
Mensajes: 125
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: frase aleatoria que no se repita

Quizas sea tarde yo lo que hubiese hecho es en una tabla enumerar cada frase del 0 hasta las que tengas (id , frase , autor.)
Utilaando la funcion
Código PHP:
$Diadate (z); 
Te entrega el numero del año (0...364) del dia actual.
A ese numero la aplicas la funcion MODULO con el numero total de frases.
Que te da el resto de una division te va a dar un numero del 0 al numero_total_de frase.
es decir
Código PHP:
$numero_de_frase_del_dia=$Dia $numero_total_de_frases 
Pd:no lo probe no se que pasa si $Dia es menor al numero total de frases (en ese caso para asegurar siempre antes de la operacion modulo haria $Dia=$Dia + $numero toal de frases.

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




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