1. Inleiding
Het sorteren van gegevens die in je MySQL database staan kan heel eenvoudig via een een query op een php pagina. Het is niet
moeilijk, maar je moet ook letten op veiligheid. In deze tutorial ga ik uitleggen hoe je moet sorteren in mysql en hoe je dat
dan ook gelijk veilig kunt doen. Je moet het SELECT statement kennen, kijk daarvoor in
deze tutorial!
Veel succes alvast ;-).
2. Basis
Om te kunnen sorteren heb je meerdere rijen met gegevens nodig, op zijn minst 2 natuurlijk. Bij deze tutorial gebruik
ik de tabel 'leden' met de volgende gegevens:
CREATE TABLE leden (
id TINYINT(3) NOT NULL AUTO_INCREMENT,
voornaam VARCHAR(20) DEFAULT '',
achternaam VARCHAR(20) DEFAULT '',
leeftijd TINYINT(3) DEFAULT '0',
land VARCHAR(20) DEFAULT '0',
PRIMARY KEY (id) );
INSERT INTO leden VALUES ('','Joël','Verheyen',17,'België');
INSERT INTO leden VALUES ('','Wijnand','Ridder, de',19,'Nederland');
INSERT INTO leden VALUES ('','Dennis','Lexis',15,'Nederland');
INSERT INTO leden VALUES ('','René','Willemsen',14,'Nederland');
Deze bovenstaande query's moet je gewoon uitvoeren in je PhpMyAdmin of lees
deze
tutorial eens door te nemen. Als je dat hebt gedaan dan staan ze in je database, en kun je ze opvragen.
Nu ga ik ze opvragen gesorteerd op ID, dat doe ik met de volgende query:
SELECT * FROM leden ORDER BY id
Dat wordt dan dus de volgende query in php:
<?
mysql_query("SELECT * FROM leden ORDER BY id") or die(mysql_error());
?>
Nu moet je de resultaten nog geordend weergeven. Dat kan met een while() loop.
<?
$query = mysql_query("SELECT * FROM leden ORDER BY id") or die(mysql_error());
while($row = mysql_fetch_assoc($query))
{
echo $row['voornaam'].' '.$row['achternaam'].'<br>';
// hier drukt hij de voornaam en achternaam neer
}
?>
Deze query geeft dit als volgt als resultaat:
Joël Verheyen Wijnand Ridder, de Dennis Lexis René Willemsen
Dat is dus vrij simpel, omdat ik op ID sorteer zal dus automatisch Joël als eerste verschijnen en René pas als laatste.
Maar nu ben je er nog lang niet, want er kan nog heel veel meer mee. Bij het voorbeeld hierboven sorteert hij van boven naar
beneden, maar dat kan ook andersom door middel van DESC. DESC is het tegenovergestelde van ASC. Standaard staat er ASC achter,
dus het is niet nodig om in een query ASC te zetten als hij dat toch al automatisch doet. ASC houdt in dat het oploopt (1 - 10) en
DESC houdt in dat het afloopt (10 - 1).
In het volgende voorbeeld ga ik laten zien hoe je kunt sorteren op achternaam aflopend, dus van Z naar A.
<?
$query = mysql_query("SELECT * FROM leden ORDER BY achternaam DESC") or die(mysql_error());
while($row = mysql_fetch_assoc($query))
{
echo $row['achternaam'].'<br>';
}
?>
Dit geeft als resultaat dat eerst Willemsen komt en Lexis als laaste.
Zo kun je vele combinaties maken van kolomnamen en ASC of DESC
Nu zie je misschien 3 keer Nederland staan, dan sorteert hij automatisch op ID, maar dat wil je misschien wel anders hebben.
En dat is mogelijk, door een andere query te doen.
SELECT * FROM leden ORDER BY land,voornaam
Deze query geeft het volgende resultaat:
Joël Verheyen woont in België
Dennis Lexis woont in Nederland
René Willemsen woont in Nederland
Wijnand Ridder, de woont in Nederland
Nu snap je als het goed is de basis van sorteren, dus je kunt eventueel verder naar de volgende stap.
3. Sorteren naar eigen wens
Je hebt soms veel gegevens in je database staan, maar als bezoeker wil je dan toch wel kunnen sorteren naar
eigen wens, dat varieert. Daarom kun je heel eenvoudig een klein sorteer systeempje eromheen bouwen. Ik ga
nu uitleggen hoe je eenvoudig mensen kunt laten sorteren op kolomnaam en oplopend of aflopend, eerst maar beginnen
met het eerste.
Om toch goed te sorteren (dat er in de adresbalk niet het een en ander wordt veranderd) kun je het op 2 manieren
het beste doen, ik zal ze beide bespreken.
Mogelijkheid 1
De eerste mogelijkheid is het in een array zetten van je velden, dat kan er als volgt uit zien:
<?
$array = array('id','voornaam','achternaam','leeftijd','land');
if(isset($_GET['sortby']))
{
$sorteer = (in_array($_GET['sortby'],$array)) ? $_GET['sortby'] : 'id';
// hier kijkt hij of het in de array voorkomt, zoniet dan sorteert hij op ID.
}
else
{
$sorteer = 'id';
// hier sorteert hij op ID omdat de variabele $_GET['sortby'] niet bestaat (er staat dus geen ?sortby= in de adresbalk.
}
$query = mysql_query("SELECT * FROM leden ORDER BY ".$sorteer) or die(mysql_error());
// en de rest snap je nu wel...
?>
Dit moet je dan in een url opvragen met pagina.php?sortby=voornaam of achternaam etcetera.
Mogelijkheid 2
Deze mogelijkheid is met switch,case,default en break. Het gaat als volgt in werking:
<?
if(isset($_GET['sortby']))
{
switch($_GET['sortby'])
{
case 'id': $sorteer = 'id'; break;
case 'voornaam': $sorteer = 'voornaam'; break;
case 'achternaam': $sorteer = 'achternaam'; break;
case 'leeftijd': $sorteer = 'leeftijd'; break;
case 'land': $sorteer = 'land'; break;
default: $sorteer = 'id'; break;
}
}
else
{
$sorteer = 'id';
}
$query = mysql_query("SELECT * FROM leden ORDER BY ".$sorteer) or die(mysql_error());
?>
Hierbij gebruik je telkens case om een nieuwe kolom toe te voegen, Dat is een stukje meer code dan in een array, maar het werkt
wel net zo goed.
Nu kun je eindelijk sorteren naar eigen wens, maar nog niet aflopend of juist oplopend, dat is ook vrij eenvoudig, en je kunt
het met beide mogelijkheden met het sorteren combineren. Je moet alleen even duidelijk maken of het DESC of ASC moet worden,
dat kan heel eenvoudig met de volgende code:
<?
$manier = (isset($_GET['updown']) && $_GET['updown'] == 'DESC') ? 'DESC' : 'ASC';
// hier wordt dus gekeken of &updown= erin zit en of DESC erachter staat, zoniet dan sorteert hij automatisch op ASC
mysql_query("SELECT * FROM leden ORDER BY ".$sorteer." ".$manier) or die(mysql_error());
// Nu komt $sorteer nog uit manier 1 of 2, die je er zelf boven moet plakken.
?>
Nu kan een url verschillende vormen hebben:
?sortby=voornaam&updown=DESC
?updown=DESC
Als je op ASC wilt sorteren, dan hoef je er in dit geval geen updown=DESC achter te zetten.
4. Eindwoord
Ik hoop dat je met het lezen van deze tutorial het sorteren in MySQL begrijpt, mocht je toch nog vragen hebben dan kun je het altijd
vragen op het forum, want daar is het nou eenmaal voor.