Foros del Web » Programando para Internet » PHP »

Random

Estas en el tema de Random en el foro de PHP en Foros del Web. COmo puedo hacer una consulta a la BD que me seleccione los campos por id de forma aleatoria. Saludos...
  #1 (permalink)  
Antiguo 15/10/2003, 09:52
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 4 meses
Puntos: 1
Random

COmo puedo hacer una consulta a la BD que me seleccione los campos por id de forma aleatoria.
Saludos
__________________
Ing. Reynier Pérez Mira
  #2 (permalink)  
Antiguo 15/10/2003, 10:43
Avatar de McManaman  
Fecha de Ingreso: agosto-2003
Ubicación: Ecuador - Guayaquil
Mensajes: 119
Antigüedad: 20 años, 7 meses
Puntos: 0
mmmm podrias hacer que en una variable vaya un numero aleatorio y al hacer el select pongo where id= a la variable con un numero aleatorio
o sea
$numero_aleatorio=rand(0,10);//0 es el numero inicial - 10 el numero final....tambien puedes poner variables en estos campos para definir el rango
$sql="select * from nombretabla where id='$numeroaleatorio'";
__________________
...Hay unos que saben TODO de nada y otros que saben NADA de TODO... think about it
  #3 (permalink)  
Antiguo 15/10/2003, 15:51
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

El metodo de McManaman solo tiene un fallo. Que tines que saber el numero de registros, y que no puedes haber borrado ningun registro (necesitas que esten todos los valores).

El metodo mas o menos estandard de hacer lo que pides es con

SELECT * FROM tabla ORDER BY RAND()

Lo que pasa es que puede ser poco aleatoria (el problema de la aleatoriedad en informatica).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #4 (permalink)  
Antiguo 14/11/2003, 13:15
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 3 meses
Puntos: 1
Saludos

Tengo lo siguiente:

$query = "SELECT * FROM " . TBL_IMGP . " WHERE status_imgp = '1' ORDER BY RAND()";

Pero siempre me trae el mismo valor.

Recargo y recargo la página y siempre me trae el mismo valor.

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #5 (permalink)  
Antiguo 15/11/2003, 23:35
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
José Molina

Lo primero que puede estar pasando es que realmente sólo exista un registro en tu bd DONDE el campo status_imgp='1'...

Reynier:

Si vas a necesitar hacer eso varias veces, lo que puedes hacer es guardar los resultados en un array y utilizar funciones de array así:

while ($row[]=mysql_fetch_array($result)){
//lo que sea
}
Luego puedes hacer un
$indice=array_rand($row);
Eso coge un índice aleatorio de tu array $row
Lo utilizas así:
echo $row[$indice]['campo'];

En realidad creo que me mandé con una pastrulada... te iba a decir que si necesitas eso varias veces, guardes el array $row en una sesión y lo llamas desde cualquier parte.. así siempre te da un registro aleatorio sin hacer nuevamente la consulta a la BD...
pero creo que sería demasiado si tienes muchos registros... No sé.. es una idea... y las opiniones nunca están de más ¿no? xD...

Saludos
  #6 (permalink)  
Antiguo 17/11/2003, 10:21
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 3 meses
Puntos: 1
Saludos

Efectivamente el status_imgp es para activar o no las imágenes que quiero aparezcan.

Para que tengan una idea veanlo aquí:

www.inserca.com/index_new.php

Les estoy imprimiendo el query y el ID de la foto.

La idea es que cada vez que recarguen me traiga una foto distinta.

En mi web server local funciona perfectamente, pero cuando lo subo ya no.

La db esta construida con el código que me genero la misma db que uso localmente, pensando que quizas era el tipo de dato que estaba usando, pero no es eso.

También pense que sería algo con el servidor, que no tendría activo ese módulo o esa función RAND(), pero probe con RAND(a,b) usando los valores de id de las imágenes y comenzo a funcionar. Pero como aquí mismo se aclaro, eso no me funciona para varios registros no consecutivos, o si borro registros consecutivos.

Gracias a todos.
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.

Última edición por José Molina; 17/11/2003 a las 10:42
  #7 (permalink)  
Antiguo 17/11/2003, 13:37
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 3 meses
Puntos: 1
Exclamación Aún peor

Saludos

Resulta que el mismo query lo estoy usando en las secciones del home:

-Los Servicios

Y los dos bloques inferiores.

Estos si se cambian aleatoriamente al recargar la página.

Ahora se puso peor mi incognita....

Porque si funciona en las otras y no en la primera (la que estoy imprimiendo en pantalla www.inserca.com/index_new.php) ??

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #8 (permalink)  
Antiguo 17/11/2003, 15:48
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Realmente si te funciona. Tiene la ligera tendecia de sacar mas de un 90% el ID 3, pero he llegado a ver el ID 5.

El problema del RAND() es que con un conjunto bajo de registros, tiende a poner el mismo el primero. Al menos yo he observado que si tienes mas de 10 registros, empieza a notarse mas el cambio.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #9 (permalink)  
Antiguo 17/11/2003, 15:51
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 3 meses
Puntos: 1
Saludos

Pero si lograstes ver una foto distinta??

Si es así entonces si esta funcionando ??

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #10 (permalink)  
Antiguo 17/11/2003, 16:02
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Si, recarge la pagina unas 20 veces, y 2 de ellas salio la del ID 5.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #11 (permalink)  
Antiguo 19/11/2003, 07:51
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 3 meses
Puntos: 1
Saludos.

Estoy nuevamente por aquí por lo siguiente.

Si bien es cierto que la imagen funciona con el RAND () despues de las 20 recargas (apróx.) resulta que es como que muchas recargas para ver una nueva imágen y apenas aparece esa nueva imágen, en la siguiente recarga, coloca la misma con la que empezo.

En la db hay más de 11 imágenes disponibles, así que me parece debo utilizar otro método para que aparezcan las imágenes al azar.

Intente de la manera como hace referencia jpinedo :

while ($db->(next_record()){
$indice = $indice . " " . $campo
}

$indice=array_rand($indice);

Pero me dice que array_rand debe tener otro parámetro

Me hace falta algo en realidad pero no encuentro que será.

Ideas ??

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #12 (permalink)  
Antiguo 19/11/2003, 08:01
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Revisa www.php.net/array_rand . No necesita otro parametro, sino otro tipo de parametro. El parametro que le pases debe ser un array. Y tu le estas pasando una cadena. Si haces algo como:
Código PHP:
$indice[] = $campo
dentro del bucle, $indice sera un array con los valores de $campo. Y entonces te funcionara el array_rand(). Pero tampoco esperes gran aletoriedad. Los ordenadores son muy malos creando numeros aleatorios. Es mas, conociendo ciertos valores internos de los momentos en que se calcula en numero aleatorio, se es capaz de volver a generar los mismos numeros en el mismo orden. Y si la aletoriedad es reproducible, ...

Saludos.

PD: Esto, me suena la primera nota de los usuarios en la pagina del manual de array_rand(), ¿de quien sera?
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #13 (permalink)  
Antiguo 19/11/2003, 08:19
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 3 meses
Puntos: 1
Saludos.

Excelente explicación josemi. Gracias

Si funciona .. casi .. perfectamente.

Qué sucede??

el id de cada imágen es un int de 2 digitos:

- 1
- 2
- 3
- 12
- 19

Ahora, cuando el array_rand($indice) captura por ejemplo la posición 4 que debería ser el "12", resulta que me captura un "1" e igualmente pasa en el "19"...

????

(Puedes verlo en www.inserca.com/index_new.php)

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.

Última edición por José Molina; 19/11/2003 a las 08:21
  #14 (permalink)  
Antiguo 19/11/2003, 08:28
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Mejor pon tu el trozo de codigo que usas actualmente, porque me extraña ese comportamiento.

Espera, he vuelto ha revisar el manual y pone
Cita:
If you are picking only one entry, array_rand() returns the key for a random entry. Otherwise, it returns an array of keys for the random entries. This is done so that you can pick random keys as well as values out of the array.
Es decir, que devuelve el indice del array. Y me parece que tue estas pasando a tu query el valor devuelto por array_rand(), cuando tendrias que estar pasando el valor del array para el indice devuelto por array_rand().

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #15 (permalink)  
Antiguo 19/11/2003, 08:30
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 3 meses
Puntos: 1
Saludos

while ($db->next_record()) {
$indice[] = $db->f("id_imagen");
}

$indice_final = array_rand($indice);

$query = "SELECT * FROM " . TBL_IMGP . " WHERE status_imgp = 1 AND id_imagen = '". $indice_final . "'";

Ese es el código
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
  #16 (permalink)  
Antiguo 19/11/2003, 08:33
Avatar de José Molina  
Fecha de Ingreso: enero-2002
Ubicación: USA
Mensajes: 768
Antigüedad: 22 años, 3 meses
Puntos: 1
Saludos

Lo modifique a este:

while ($db->next_record()) {
$indice[] = $db->f("id_imagen");
}

$indice_final = array_rand($indice);

$query = "SELECT * FROM " . TBL_IMGP . " WHERE status_imgp = 1 AND id_imagen = '". $indice[$indice_final] . "'";


Creo que ahora si lo he hecho como debe ser

Gracias
__________________
José Molina
La marginalidad no esta en la incapacidad de calmar el hambre de un estómago sino en la incapacidad de calmar el hambre de la mente.
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 21:15.