MySQL/PHP. Vælg en række random resultater ud
Hej eksperterSå har jeg lige brug for lidt assistance til noget MySQL/PHP.
Jeg er i gang med at lave et banner-rotationssystem. Jeg har oprettet en database (med lige nu 5) forskellige bannere i. Det er som heller ikke der problemet ligger. Problemet er at få printet dem ud. Jeg vil gerne have at den helt tilfældigt vælger et x antal af bannerne og herefter printer dem ud i en helt tilfældig rækkefølge.
Det drejer sig om denne side, hvis det hjælper på forståelsen af hvad jeg vil: http://www.bornstein.dk/swom/hist.php
Jeg lavede først dette script:
----------------------------------------kode----------------------------------------
<?php
$pr_ekz_height = 75;
$pr_ekz_width = 100;
$pr_public_zerro = 0;
$pr_public_query = "SELECT id, pic, title FROM swim_pr_publicity WHERE height='$pr_ekz_height' AND width='$pr_ekz_width' AND status='1'";
$pr_public_res = mysql_query($pr_public_query) or die(mysql_error());
while($pr_public_resl = mysql_fetch_array($pr_public_res)) {
$pr_public_id[$pr_public_zerro] = $pr_public_resl["id"];
$pr_public_pic[$pr_public_zerro] = $pr_public_resl["pic"];
$pr_public_title[$pr_public_zerro] = $pr_public_resl["title"];
$pr_public_zerro = $pr_public_zerro+1;
}
$pr_public_antal = mysql_num_rows($pr_public_res);
srand ((float)microtime()*1000000);
for ($i=0;$i<$pr_public_antal;$i++) {
$udtraek[]=$i;
}
shuffle($tabel);
$reklamenr1 = $udtraek[0];
$reklamenr2 = $udtraek[1];
$reklamenr3 = $udtraek[2];
$reklamenr4 = $udtraek[3];
echo " <div style=\"height: 25%;\">
<div class=\"reklame\"><a href=\"count.php?id=$pr_public_id[$reklamenr1]\" target=\"_blanc\"><img src=\"$site_host/images/pr/$pr_public_pic[$reklamenr1]\" height=\"75\" width=\"100\" alt=\"$pr_public_title[$reklamenr1]\"></a></div>
</div>
<div style=\"height: 25%;\">
<div class=\"reklame\"><a href=\"count.php?id=$pr_public_id[$reklamenr2]\" target=\"_blanc\"><img src=\"$site_host/images/pr/$pr_public_pic[$reklamenr2]\" height=\"75\" width=\"100\" alt=\"$pr_public_title[$reklamenr2]\"></a></div>
</div>
<div style=\"height: 25%;\">
<div class=\"reklame\"><a href=\"count.php?id=$pr_public_id[$reklamenr3]\" target=\"_blanc\"><img src=\"$site_host/images/pr/$pr_public_pic[$reklamenr3]\" height=\"75\" width=\"100\" alt=\"$pr_public_title[$reklamenr3]\"></a></div>
</div>
<div style=\"height: 25%;\">
<div class=\"reklame\"><a href=\"count.php?id=$pr_public_id[$reklamenr4]\" target=\"_blanc\"><img src=\"$site_host/images/pr/$pr_public_pic[$reklamenr4]\" height=\"75\" width=\"100\" alt=\"$pr_public_title[$reklamenr4]\"></a></div>
</div>
";
?>
---------------------------------------/kode----------------------------------------
Men bag efter fandt jeg ud af at det kunne være godt, hvis man også kunne vælge hvor mange der skulle vises på engang, og det derfor ikke skulle være fastlåst på 4 stykker.
Jeg kom også i tanke om at der da sagtens kunne komme helt op til 20 bannere der passede på mine whiles.
Jeg prøvede derfor at lave et nyt script:
----------------------------------------kode----------------------------------------
<?php
$pr_ekz_height = 75;
$pr_ekz_width = 100;
$pr_public_procent = floor(100/$pr_public_antal);
// $pr_public_query = "SELECT id, pic, title FROM swim_pr_publicity WHERE height='$pr_ekz_height' AND width='$pr_ekz_width' AND status='1' AND media='1' ORDER BY RAND() LIMIT 0,$pr_public_antal";
// $pr_public_query = "SELECT id, pic, title, rand() AS tt FROM swim_pr_publicity WHERE height='$pr_ekz_height' AND width='$pr_ekz_width' AND status='1' AND media='1' ORDER BY tt LIMIT 0,$pr_public_antal";
// $pr_public_query = "SELECT id, pic, title, ((ID*0)+rand()) AS RandomID FROM swim_pr_publicity WHERE height='$pr_ekz_height' AND width='$pr_ekz_width' AND status='1' AND media='1' ORDER BY RandomID LIMIT 0,$pr_public_antal";
$pr_public_res = mysql_query($pr_public_query) or die(mysql_error());
while($pr_public_resl = mysql_fetch_array($pr_public_res)) {
$pr_public_id = $pr_public_resl["id"];
$pr_public_pic = $pr_public_resl["pic"];
$pr_public_title = $pr_public_resl["title"];
echo " <div style=\"height: $pr_public_procent%;\">
<div class=\"reklame\"><a href=\"count.php?id=$pr_public_id\" target=\"_blanc\"><img src=\"$site_host/images/pr/$pr_public_pic\" height=\"75\" width=\"100\" alt=\"$pr_public_title\"></a></div>
</div>
";
}
?>
---------------------------------------/kode----------------------------------------
Det den gerne skulle gøre er at den allerede i udtrækket skulle vælge 4 tilfældige bannere. Jeg har prøvet med de tre løsningsforslag med //’erne foran. Men det er som om rand() –funktionen i MySQL-en ikke rigtig virker. Den kommer mere eller mindre hver gang frem med samme kombination. Næsten hver gang kommer id nr. 1 først, efterfulgt af id nr. 2. Så kommer enten nr. 3 eller 5, og så til sidst nr. 4. (Prøv på siden at holde musen over bannerne. Så kan I i statusbaren se id’et)
Nogle gange virker den dog, men langt de fleste gange kommer den med dem i næsten numerisk rækkefølge.
Jeg skal have lavet det så det er HELT tilfældigt. Det er som om den lige nu hælder mest til at komme med dem i slavisk rækkefølge.
Jeg tænkte så på at lave en count på alle rækkerne der matchede, og så bagefter i en for-løkke hente dataene fra de forskellige ud.
Men vil det ikke både tage for lagt tid, og kræve for meget af serveren??
Men første version virkede RIGTIG godt. Men jeg tror det bliver et problem når der kommer op til 20-30 matchende resultater der først skal hentes ud i variabler, som så slet ikke bliver brugt til noget
Altså kort og godt, er spøgsmålet: Hvordan skal jeg hurtigst, og mindst serverkrævende få et bedre random-udtag??
Løsningen må gerne benytte PHP, hvis det kunne hjælpe på det.
Men hvordan ville i selv gøre det hvis det var jer der stod med denne opgave?
På forhånd mange tak for hjælpen
/Nicklas B.
