jag använder mig av detta lilla script just nu för att "slumpa" fram olika användare.
Problemet är att den ibland tar samma user efter varann.
Någon som kan lösa det?
<?
require("db.php");
mysql_connect("localhost","$dbu","$dbp");
mysql_select_db("filip");
function random_users($amount){
$sql_query = mysql_query("SELECT username FROM mingla ORDER BY rand() LIMIT 1,$amount");
while($result = mysql_fetch_assoc($sql_query)){
echo $result['username'];
}
}
// såhär använder du den:
random_users(1); // <- väljer antal random users
?>
Hur många användare har du i din DB då?
I och med att den slumpar fram kan man ju inte veta om den blir samma som tal som precis varit.
Det är ju som sagt var slumpen som avgör.
Du kan ju också kika lite på PHP's random funktioner som kanske kan vara lite mer komplexa.
Prova annars och se om det gör någon skillnad om du ger RAND() en "seed".
function random_users($amount){
$N = mt_rand(0, pow(2,31)-1);
// Har du en PHP-version före 4.2.0 så måste du köra mt_srand före mt_rand
$sql_query = mysql_query("SELECT username FROM mingla ORDER BY rand($N) LIMIT 1,$amount");
tror inte det kommer att lösa ditt problem.
för det första får du ju bara ett användarnamn och skulle du anropa funktionen flera gånger så är det ändå stor risk att du får samma användare för det är inget som säger att den inte kan slumpa fram samma tal igen.
testa att göra så här:
// 1) för att veta inom vilket spann som man kan välja tal.
$result = mysql_query("SELECT MIN(id), MAX(id) FROM mingla");
$nyckel = mysql_fetch_row($result);
// 2) slumpa fram $amount olika tal
$userid = null;
for ($i=0;$i<$amount;$i++)
$userid[] = slumpa_nytt_tal($nyckel[0], $nyckel[1], $userid);
// 3) dags att hämta alla användare från deras ID.
// detta kan man också göra på olika sätt
// antingen hämtar man de var och en för sig genom vars en SQL-fråga
/*
foreach($userid as $id)
{
$reslut = mysql_query("SELECT username FROM mingla WHERE id='$id'");
}
*/
// annars kan man bygga upp SQL-fråga som hämtar alla på en gång, men detta kanske kan bli långsamt vid stora databaser.
/*
$first_id = true;
foreach($userid as $id)
$sql = "SELECT username FROM mingla WHERE ";
{
if ($first_id)
{
$sql .= " ID='$id' ";
$first_id = false;
}
else
$sql .= " AND ID='$id' ";
}
$reslut = mysql_query($sql);
*/
function slumpa_nytt_tal($min, $max, $array)
{
// slumpa fram nytt tal
$post = rand($min,$max);
// kolla att ID inte redan finns i $userid
while (finns_i_array($post,$array)
{
// finns den kan du antingen öka userid med 1
// $post++;
// eller testa att slump fram ett litet tal genom rand(1,5)
// $post += rand(1,5);
// i de fall man ökar $post måsta man kolla att vi inte får ett för högt tal.
//if ($post > $max)
// $post = $post % $max;
//nu måste vi kolla att vi inte fått för lågt tal.
// if ($post < $min)
// $post = $min;
// annars kan du slump om taler helt och hållet.
// $post = rand($min,$max);
}
return $post;
}
// där finns lite olika sätt.
// du kan ju testa vilket som är bäst
// kollar om ett tal finns med i en array.
// kanske finns någon färdig funktion i PHP för det.
function finns_i_array($nytt_tal, $array)
{
foreach($array as $gamalt_tal)
if ($nytt_tal == $gamalt_tal)
return true;
return false;
}
mycket möjligt jag har gömt något nu, har inte testat koden.
hoppas det hjälper dig lite.
require("db.php");
mysql_connect("localhost","$dbu","$dbp");
mysql_select_db("filip");
// 1) för att veta inom vilket spann som man kan välja tal.
$result = mysql_query("SELECT MIN(id), MAX(id) FROM mingla");
$nyckel = mysql_fetch_row($result);
// 2) slumpa fram $amount olika tal
$userid = null;
for ($i=0;$i<$amount;$i++)
$userid[] = slumpa_nytt_tal($nyckel[0], $nyckel[1], $userid);
// 3) dags att hämta alla användare från deras ID.
// detta kan man också göra på olika sätt
// antingen hämtar man de var och en för sig genom vars en SQL-fråga
/*
foreach($userid as $id)
{
$result = mysql_query("SELECT username FROM mingla WHERE id='$id'");
}
*/
// annars kan man bygga upp SQL-fråga som hämtar alla på en gång, men detta kanske kan bli långsamt vid stora databaser.
/*
$first_id = true;
foreach($userid as $id)
$sql = "SELECT username FROM mingla WHERE ";
{
if ($first_id)
{
$sql .= " ID='$id' ";
$first_id = false;
}
else
$sql .= " AND ID='$id' ";
}
$result = mysql_query($sql);
*/
function slumpa_nytt_tal($min, $max, $array)
{
// slumpa fram nytt tal
$post = rand($min,$max);
// kolla att ID inte redan finns i $userid
while (finns_i_array($post,$array) )
{
// finns den kan du antingen öka userid med 1
// $post++;
// eller testa att slump fram ett litet tal genom rand(1,5)
// $post += rand(1,5);
// i de fall man ökar $post måsta man kolla att vi inte får ett för högt tal.
//if ($post > $max)
// $post = $post % $max;
//nu måste vi kolla att vi inte fått för lågt tal.
if ($post < $min)
$post = $min;
// annars kan du slumpa om talet helt och hållet.
$post = rand($min,$max);
}
return $post;
}
// där finns lite olika sätt.
// du kan ju testa vilket som är bäst
// kollar om ett tal finns med i en array.
// kanske finns någon färdig funktion i PHP för det.
function finns_i_array($nytt_tal, $array)
{
foreach($array as $gammalt_tal)
if ($nytt_tal == $gammalt_tal)
return true;
return false;
}
den klagar på foreach($userid as $id) raden... spelar ingen roll vilken av metoderna man kommenterar av.
Förresten, är ID en INT eller varchar?
tnäkte på det tidigare men glömde bort det sen.
Någon hade skrivit i SQL-frågan ID='$post'
har du kollat om du får ut något från den första SQL-frågan där du väljer ut min och max?
har ingen aning om det går om det är en varchar.