Hola Solimar:
Un punto que es importante aclarar es que el
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
), con lo cual, es perfectamente posible que en dos requests sucesivos se genere el mismo registro al comienzo (Y, como usas
, 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
existe y tiene algo.
- Si no existe se crea con un único valor (-1)
- Se genera una query de este tipo:
- Se guarda en el arreglo el id de la imagen mostrada actualmente
Para evitar el problema de la performance de
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.