mahedelMedlem sedan juli 2002105 inlägg 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
?>
monAmourMedlem sedan dec. 2002258 inlägg 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.
jag hade ett liknande problem när jag skulle slumpa fram bilder från ett medlemsgalleri på min site.
jag löste detta med hjälp av kombinera md5() och rand():
$sql_query = mysql_query("SELECT username FROM mingla ORDER BY md5(rand()) LIMIT 1,$amount");
detta kan dock bli en långsamlösning om du har många poster i din tabell (över 250 000).
Här är en lösning för att lösa problemet med många poster, förutsatt att du har en id kolumn med auto-increasment:
$result = mysql_query("SELECT MIN(id), MAX(id) FROM mingla");
$nyckel = mysql_fetch_row($result);
$post = rand($nyckel[0],$nyckel[1]);
$reslut = mysql_query("SELECT username FROM mingla WHERE id>='$post' LIMIT 1");
MatteMedlem sedan aug. 20002 975 inlägg 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");
mahedelMedlem sedan juli 2002105 inlägg tjo!
tjo!
monAmour: jag har 22 st användare i db:n.
peterpops: men din md5 lösning så blev det som tidigare ibland samma user.
matte: med din så blev det också i rad. kanske pga. att jag har en senare version av php.
har ej provat denna ännu:
peterpops:
Här är en lösning för att lösa problemet med många poster, förutsatt att du har en id kolumn med auto-increasment:
$result = mysql_query("SELECT MIN(id), MAX(id) FROM mingla");
$nyckel = mysql_fetch_row($result);
$post = rand($nyckel[0],$nyckel[1]);
$reslut = mysql_query("SELECT username FROM mingla WHERE id>='$post' LIMIT 1");
kanske kan denna funka bättre får testa sen.
/Martin
The_HulkMedlem sedan juni 20031 837 inlägg 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.
mahedelMedlem sedan juli 2002105 inlägg hmm
såhär ser filen ut nu (efter lite modifiering):
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.
/MVH Martin
The_HulkMedlem sedan juni 20031 837 inlägg kolla så att $userid != null eller att den inte är tom
if ($userid == null)
echo "\$userid == null";
elseif (count($userid) == 0)
echo "count(\$userid) == 0";
lägg till det innan foreach.
den klagar inte på foreach funktionen finns_i_array?
The_HulkMedlem sedan juni 20031 837 inlägg 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.
The_HulkMedlem sedan juni 20031 837 inlägg testade att köra det på min dator.
hittade iaf ett fel.
fuktionen finns_i_array misslyckas om arrayn du skickar in är null vilket den är första gången.
här är en modifierad version av den.
function finns_i_array($nytt_tal, $array)
{
if ($array != null && count($array)>0)
{
foreach($array as $gammalt_tal)
if ($nytt_tal == $gammalt_tal)
return true;
}
return false;
}
The_HulkMedlem sedan juni 20031 837 inlägg nu fungerade den bra för mig.
du måste även göra någon med resultaten du får från databasen.
The_HulkMedlem sedan juni 20031 837 inlägg upptäckte två fel i steg 3 om man väljer det andra sättet
nu sker tilldelningen av $sql= i foreach
det ska givetvis ske före foreach
ska inte vara AND ID
$sql .= " AND ID='$id' ";
utan OR ID
$sql .= " OR ID='$id' ";