PHP - mostrar imágenes de forma aleatoria sin repetirse

 
Vista:
sin imagen de perfil

mostrar imágenes de forma aleatoria sin repetirse

Publicado por solimar (12 intervenciones) el 20/08/2018 18:33:26
buenas tarde,

quisiera que me ayudaran, lo que quiero hacer es que al cargar mi vista se descargue una imagen que se encuentra en mi tabla imagenes. Pero esto lo quiero hacer cada vez que cargue mi vista, y que la imagen no se repita.

Es decir, si en mi tabla tengo 10 imagenes, que al cargar se me descargue una por una sin que se repita.


En mi consulta ya he intentado lo siguiente: SELECT * FROM carga_imagenes WHERE status='Pendiente' ORDER BY RAND() LIMIT 1
pero cada vez que recargo me descarga la imagen, bien, pero se repite
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

mostrar imágenes de forma aleatoria sin repetirse

Publicado por Gonzalo (615 intervenciones) el 21/08/2018 02:35:34
buenos días don solimar.

lo que yo hice fue crear un campo tinyint=0 y fui marcando los registros hasta que ya no encontré registros, entonces los remarque a cero y eso iso el truco.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

mostrar imágenes de forma aleatoria sin repetirse

Publicado por xve (6935 intervenciones) el 21/08/2018 12:01:30
Es una buena solución!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

mostrar imágenes de forma aleatoria sin repetirse

Publicado por xve (6935 intervenciones) el 21/08/2018 11:40:34
Pero cada vez que muestras la imagen cambias el "status" para que no siga estando como Pendiente?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

mostrar imágenes de forma aleatoria sin repetirse

Publicado por solimar (12 intervenciones) el 21/08/2018 17:07:58
de esta forma lo hice, pero habra forma de descargar una imagen desde javascript?? En caso de ser SI, me podrian comentar como hacerlo?

Yo lo hago de esta forma y lo descarga pero no muestra la imagen:

1
2
3
4
5
var link = document.createElement("a");
var data_type = 'data:image/jpg';
link.download = data;  ==> es el nombre de la imagen
link.href = "public/imagenes/";
link.click();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

mostrar imágenes de forma aleatoria sin repetirse

Publicado por Gonzalo (615 intervenciones) el 22/08/2018 04:03:07
si.

porque la otra es usar random y mostrar las imagenes al azar, pero es posible que 1 imagen se muestre mas de 1 vez en forma consecutiva y mas si hablamos de un catalogo reducido.

salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

mostrar imágenes de forma aleatoria sin repetirse

Publicado por Mauro (1036 intervenciones) el 29/08/2018 21:17:04
Hola Solimar:

Un punto que es importante aclarar es que el
1
ORDER BY RAND()
es muy ineficiente (le pega muy duro a la DB) y, en este caso en particular, no va a lograr tu objetivo.

El problema es que la consulta se ejecuta en cada request y MySQL no guarda registro de los órdenes aleatorios que generó en cada pedido (Lo que hace efectivamente
1
ORDER BY RAND()
), con lo cual, es perfectamente posible que en dos requests sucesivos se genere el mismo registro al comienzo (Y, como usas
1
LIMIT 1
, te lo de más de una vez).

La solución que propone Gonzalo puede funcionar, aunque le veo un par de inconvenientes:

1 - Requiere hacer una "limpieza" al finalizar para que en una nueva corrida todas las imágenes vuelvan a participar
2 - Si hay muchos usuarios utiizando el sitio a la vez el random de uno afectará al otro... y probablemente pronto se queden sin imágenes para mostrar.

Una solución alternativa es utilizar la sesión (que siendo propia de cada usuario evitará que uno interfiera con los demás y, al ser no persistente permitirá que si un mismo usuario visita el sitio en otra ocasión las imágenes puedan serle mostradas nuevamente).

La idea es esta:

En cada request
- Se verifica si el arreglo
1
$_SESSION['idImgs']
existe y tiene algo.
- Si no existe se crea con un único valor (-1)
- Se genera una query de este tipo:
1
"SELECT * FROM tabla_imagenes WHERE id NOT IN (".implode(",", $_SESSION['idImgs']).") ORDER BY RAND() LIMIT 1"
- Se guarda en el arreglo el id de la imagen mostrada actualmente

Para evitar el problema de la performance de
1
ORDER BY RAND
lo que puedes hacer es tomar una primera query separada donde obtienes todos los posibles ids de imágenes y, en cada request pides uno al azar (Usando array_rand) y lo quitas del arreglo usado para la query (Que sería WHERE id IN en lugar de NOT IN).

El problema que puedes encontrarte aquí es que las imágenes que sean agregadas o quitadas de la DB mientras estás buscándolas no serán tenidas en cuenta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar