rand() en PHP

Whose

Tengo una duda con esta funcion, es que hago un query a una base de datos para sacar una "id" aleatoria pero siempre sale la misma...aqui os dejo el query a ver si sabeis una solucion.

$query = mysql_query("SELECT * FROM galeria ORDER BY RAND(id) LIMIT 1");
while ($row = mysql_fetch_array($query)) {

Un saludo.

PiradoIV

$numeroaleatorio = rand(1,69);
$sql = "SELECT * FROM ... $numeroaleatorio ...";

Igual te refieres a una función de MySQL para hacer rands... pero ahí ya me pillas.

Saludotes,
Pirado IV estuvo akí ;)

Whose

1 entre 69? pero tendria que poner SELECT * FROM galeria WHERE id = rand(1,69)

me equivoco?

he probado esto pero ahora siempre saca la id 4

$id=rand($a[1],$a[5]);
$query = mysql_query("SELECT * FROM galeria ORDER BY RAND($id) LIMIT 1");
while ($row = mysql_fetch_array($query)) {

c0ca

mirate la funcion mt_rand que es como rand, pero mejorada...

http://www.lania.mx/biblioteca/manuales/phpes/function.mt-rand.html

Whose

no se tio pero no me va con esa funcion :s

http://es2.php.net/manual/es/function.mt-rand.php

no sale nada de mysql en esa funcion, lo mismo no funciona en querys x_x

B

no hagas el rand con mysql. mejor lo generas con php antes de meterte en la consulta.

srand((double)microtime()*1000000);
echo rand();

ó
mt_srand((double)microtime()*1000000);
echo mt_rand();

(si no sabes lo que falla, prueba por separado como siempre xD)

y otra cosa: si algún día se ha de eliminar un registro de esa tabla, puede que los números aleatorios que generes te den un id's que ya no existan, por tanto, para asegurarte de que todos los posibles id's aleatorios que generes existen en la tabla, podrías hacer los siguiente:

  • crear una array de memoria en el que se guarde el id de cada uno de los registros de la tabla
  • generar un n_aleatorio (mínimo 0 y máximo la cantidad de posiciones de la array de memoria menos uno)
  • id_aleatorio = array_de_id's($n_aleatorio)
O

io lo hago como pirado, pero de todas formas, tienes puesto ORDER BY $random donde supongo que querrás poner WHERE id = $random

no? :S
haciendolo antes en php no t complicas y es una linea más d codigo (en caso de que en SQL se pueda me refiero)

aió

Whose

así funciona pero no coje la id de la imagen
$query = mysql_query("SELECT RAND() FROM galeria LIMIT 1") or die(mysql_error());
while ($row = mysql_fetch_array($query)) {

Whose

¿Hola?

asdasd

$num = rand(x,y); // X = valor mínimo del número aleatorio; Y = máximo;
$query = mysql_query("SELECT * FROM tabla WHERE id=$num");

B

pero así lo que estas haciendo es seleccionar un campo aleatoriamente, no un registro.

a ti te interesa algo como "SELECT * FROM galeria WHERE id=".$id_aleatorio;

y entonces, es lo que te decía antes, para conseguir un $id_aleatorio correcto tendrías que hacer por ejemplo:

// obtenemos lista de id's existentes en la tabla
$array_id="";
$Q="SELECT id FROM galeria";
$RQ=mysql_query($Q);
while($R=mysql_fetch_array($RQ)) {
. . . . $array_id[]=$R["id"];
}

// obtenemos posición aleatoria de esa lista
mt_srand((double)microtime()*1000000);
$pos = mt_rand(0,count($array_id));

// tu consulta
$query = mysql_query("SELECT * FROM galeria WHERE id=".$array_id[$pos]);

edit.: sasto, lo del #10 XD
edit2.: joder con el mysql XDD

Carcass

#10 siempre que no hayan borrado ningún registro, claro :-P

#1 Si le pasas siempre el mismo argumento a RAND, siempre da la misma secuencia de números aleatorios y por eso te sale siempre el mismo.

Llama sin parámetros y saldrá cada vez uno

SELECT * FROM galeria ORDER BY RAND( ) LIMIT 1

Y sabiendo que sólo va a salir uno, cambia el while por un if y así no evalúa dos veces la función mysql_fetch_array para nada ;)

Whose

Gracias a todos!!! al final lo hize como dijo carcass que es mas sencillito para mi.

$query = mysql_query("SELECT * FROM galeria ORDER BY RAND( ) LIMIT 1") or die(mysql_error());
if ($row = mysql_fetch_array($query)) {

funciona perfecto, gracias ;)

Usuarios habituales