Ik ben bezig met een website (mijn eerste website met PHP) die een willekeurige rij uit de database haalt, d.m.v. ORDER BY RAND(). Als ik echter weer naar de pagina ga, door weer op de button te klikken die naar de pagina leidt, neemt hij uiteraard weer een volkomen willekeurige rij uit de database. Hoe kan ik ervoor zorgen dat hij onthoudt wel rijen zijn geweest, zodat hij dus nooit dezelfde rijen krijgt als ik de pagina een paar keer laadt? Ofwel, als ik bijvoorbeeld 5 keer een random rij opvraag (5 keer de pagina laadt), ik altijd 5 verschillende rijen krijg.
Ben heel erg benieuwd of jullie het antwoord weten, ik zou het zelf namelijk echt niet weten.
Je zult natuurlijk zelf in een array moeten zien te onthouden welke nummers al gevallen zijn.
Deze nummers kun je vervolgens opslaan in de database of in een sessie bewaren en de volgende keer weer raadplegen. de nummers die al gevallen zijn verwerk je in onderstaande query tussen de haakjes achter WHERE NOT IN. Hierdoor zal de query die nummers skippen. (in het voorbeeld zullen de nummers 10, 102 en 348 overgeslagen worden).
SELECT * FROM mytable
WHERE `id` NOT IN(10,102,348) ORDER BY RAND() lIMIT 10
Ik snap inderdaad wat je bedoelt, en heb ook al veel wat dit soort dingen geprobeerd. Echter weet ik niet precies hoe ik dus de ID's in een array krijg en vervolgens in bijv. een session, waardoor ik ze tussen de haakjes van NOT IN kan plaatsen. Zou je daar misschien nog wat uitleg over kunnen geven?
jazeker, maar je moet een beetje handig zijn met arrays hiervoor.
<?php
// start sessions
session_start();
// als id_history bestaat dan halen we de id's uit deze array en verwerken die in het WHERE gedeelte van de query
$wherenotin = '';
if(isset($_SESSION['id_history']))
{
$wherenotin = ' WHERE `id` NOT IN(' . implode(',', $_SESSION['id_history']) . ')';
}
// voer de query uit
$query = "SELECT * FROM mytable " . $wherenotin . " ORDER BY RAND() lIMIT 10";
$result = mysql_query($query, $link);
// laat ons zien welke query we hebben
echo $query;
// als de query gelukt is en we rijen beschikbaar hebben
if($result && mysqli_num_rows($result) > 0)
{
// een nieuwe lege array
$ids = array();
while($row = mysqli_fetch_assoc($result)) {
//voeg het id van deze rij toe aan onze array
$ids[] = $row['id'];
}
// nu we een array hebben met de rijen die random gekozen zijn moeten we die toevoegen aan de sessie
if(isset($_SESSION['id_history']))
{
// voeg de nieuwe array toe aan de reeds bestaande array.
$_SESSION['id_history'] = array_merge($_SESSION['id_history'], $ids);
}
else
{
// de eerste keer is er nog geen array $_SESSION['id_history'] dus dan maken we hem voor het eerst aan.
$_SESSION['id_history'] = ids;
}
}
<?php
session_start();
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$ids = explode(',', $_SESSION['used_ids']);
// zorg dat de ids die in de session staan niet worden meegenomen
$query = "SELECT * FROM mytable WHERE id NOT IN(" . implode(',', $ids) . ") ORDER BY RAND() LIMIT 1";
if ($result = $mysqli->query($query)) {
/* fetch associative array */
$row = $result->fetch_assoc();
echo $row['name'];
// blablabla
// zet de id in de array
$ids[] = $row['id'];
$result->free();
}
$_SESSION['used_ids'] = implode(',', $ids);
/* close connection */
$mysqli->close();
?>
[size=xsmall]Toevoeging op 28/07/2013 13:23:32:[/size]