Verschillende filters
voor mijn website wil ik een soort filtersysteem inbouwen. Ik heb dus een tabel met atleten...
Volgende kolommen: Naam, Voornaam, Geboortedatum, Categorie, Geslacht
Nu afhankelijk van wat de gebruiker wenst wil ik een filter opzetten. Dus mogelijk sorteert hij enkel op Geboortedatum. Maar hij kan ook filteren op Geslacht & Categorie etc....
Ik zou dit doen met:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$sql1 = "SELECT *
FROM `a5852590_1`.`Atletenen`
WHERE id_atleet='$id_atleet'
ORDER BY `Resultaten`.`Resultaat` DESC"
if (!empty($_GET[Filter1]) AND empty($_GET[Filter2])){
$sql1 = "SELECT *
FROM `a5852590_1`.`Atletenen`
WHERE id_atleet='$id_atleet' AND $_GET[Filter1]='$_GET[Waarde1]'
ORDER BY `Resultaten`.`Resultaat` DESC"
}
if (!empty($_GET[Filter1]) AND empty($_GET[Filter2])){
$sql1 = "SELECT *
FROM `a5852590_1`.`Atletenen`
WHERE id_atleet='$id_atleet' AND $_GET[Filter1]='$_GET[Waarde1]' AND $_GET[Filter2]='$_GET[Waarde2]'
ORDER BY `Resultaten`.`Resultaat` DESC"
?>
$sql1 = "SELECT *
FROM `a5852590_1`.`Atletenen`
WHERE id_atleet='$id_atleet'
ORDER BY `Resultaten`.`Resultaat` DESC"
if (!empty($_GET[Filter1]) AND empty($_GET[Filter2])){
$sql1 = "SELECT *
FROM `a5852590_1`.`Atletenen`
WHERE id_atleet='$id_atleet' AND $_GET[Filter1]='$_GET[Waarde1]'
ORDER BY `Resultaten`.`Resultaat` DESC"
}
if (!empty($_GET[Filter1]) AND empty($_GET[Filter2])){
$sql1 = "SELECT *
FROM `a5852590_1`.`Atletenen`
WHERE id_atleet='$id_atleet' AND $_GET[Filter1]='$_GET[Waarde1]' AND $_GET[Filter2]='$_GET[Waarde2]'
ORDER BY `Resultaten`.`Resultaat` DESC"
?>
Zo zou ik het doen, maar ik ben ervan overtuigd dat er een duidelijkere, betere manier moet zijn, wie geeft me een klein zetje zodat ik hier kan bijleren ;-)
Groeten,
Olivier
}
Daarnaast even de vars in je query escapen.
ORDER BY werkt zo:
Gewijzigd op 25/04/2012 21:31:39 door Henk PHP
dat van die backticks wist ik niet, even opgezocht op google en inderdaad, ze worden beter niet gebruikt. Ik leer alles maar op mezelf dus tsja dat ik dat niet weet, sorry.
En escapen dan bedoel je zo ofwa?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql1 = "SELECT *
FROM `a5852590_1`.`Atleten`
WHERE $_GET[Filter1]='.$_GET[Waarde1].' AND $_GET[Filter2]='.$_GET[Waarde2].'
ORDER BY `Naam` DESC"
?>
$sql1 = "SELECT *
FROM `a5852590_1`.`Atleten`
WHERE $_GET[Filter1]='.$_GET[Waarde1].' AND $_GET[Filter2]='.$_GET[Waarde2].'
ORDER BY `Naam` DESC"
?>
Nog een oplossing voor mijn specifiek probleem.
Groeten,
Olivier
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql1 = "SELECT *
FROM Atleten
WHERE ".$_GET['Filter1']."='".$_GET['Waarde1']."' AND ".$_GET['Filter2']."='".$_GET['Waarde2']."'
ORDER BY Naam DESC"
?>
$sql1 = "SELECT *
FROM Atleten
WHERE ".$_GET['Filter1']."='".$_GET['Waarde1']."' AND ".$_GET['Filter2']."='".$_GET['Waarde2']."'
ORDER BY Naam DESC"
?>
Gewijzigd op 25/04/2012 21:45:01 door Nick Dijkstra
Wat je nu doet met een $_GET direct in je querie is trouwens onacceptabel (als dit online komt te staan tenminste).
Gewijzigd op 25/04/2012 23:07:11 door Henk PHP
Hoe doen jullie dit dan in plaats van een $_GET variabele? Ik zet mn $_GET-variabele meestal om naar een andere variabele bv. $Naam = $_GET[Naam] en gebruik dan $Naam in de query. Is dat wel goed? Of gebruiken jullie SESSIONS variabelen, of een javascript ofzo?
Groeten,
Olivier
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$sql1 = "SELECT *
FROM Atleten WHERE ".mysql_real_escape_string($_GET['Filter1'])."='".mysql_real_escape_string($_GET['Waarde1'])."' AND
".mysql_real_escape_string($_GET['Filter2'])."='".mysql_real_escape_string($_GET['Waarde2'])."'
ORDER BY Naam DESC"
?>
$sql1 = "SELECT *
FROM Atleten WHERE ".mysql_real_escape_string($_GET['Filter1'])."='".mysql_real_escape_string($_GET['Waarde1'])."' AND
".mysql_real_escape_string($_GET['Filter2'])."='".mysql_real_escape_string($_GET['Waarde2'])."'
ORDER BY Naam DESC"
?>
Gewijzigd op 25/04/2012 22:00:01 door Nick Dijkstra
Olivier Peeters op 25/04/2012 21:57:35:
Uhm zowel sorteren (op Naam, Voornaam) als filteren (Geslacht, Categorie)...
Hoe doen jullie dit dan in plaats van een $_GET variabele? Ik zet mn $_GET-variabele meestal om naar een andere variabele bv. $Naam = $_GET[Naam] en gebruik dan $Naam in de query. Is dat wel goed? Of gebruiken jullie SESSIONS variabelen, of een javascript ofzo?
Groeten,
Olivier
Hoe doen jullie dit dan in plaats van een $_GET variabele? Ik zet mn $_GET-variabele meestal om naar een andere variabele bv. $Naam = $_GET[Naam] en gebruik dan $Naam in de query. Is dat wel goed? Of gebruiken jullie SESSIONS variabelen, of een javascript ofzo?
Groeten,
Olivier
Ja gebruik gewoon ORDER BY in je query dan.
Dus ORDER BY Naam DESC voor naam, ORDER BY datum DESC voor datum en ORDER BY datum, naam DESC voor allebei
dat wist ik al +-. Alleen de manier om een of meerdere filters te kiezen was ik niet zeker. Want stel ik wil eerst niet sorteren, dan enkel op naam (ORDER BY Naam DESC) en daarna sorteren op naam en geboortedatum (ORDER BY datum, naam DESC), wat moet ik dan doen.
Telkens een andere SQL-schrijven afhankelijk van de $_GET variabelen? Of is er een kortere methode.
Even een ander vraagje (moest het niet passen splits maar op):
Stel ik schik mn resultaten van de 60m (lopen) dan krijg ik:
10"45
10"80
11"10
8"60
9"08
9"20
9"41
9"60
9"70
Zoals jullie zelf wel weten, klopt dit niet. Het resultaat zou er zo moeten uitzien:
8"60
9"08
9"20
9"41
9"60
9"70
10"45
10"80
11"10
Hoe zorg ik ervoor dat de resultaten met een 1 vanvoor achteraan komen staan? Is daar een speciale functie voor?
Groeten,
Olivier
Verder: als je vaker wilt sorten dan moet je iedere keer een nieuwe querie uitvoeren.
Tenzij je het sorteren doet via javascript, dan kan je het wel 'meteen'.
Query: controleer of een bepaald criterium bestaat (bv sorteren op naam). Zo ja, dan voeg je dit toe aan de variabele waar je 'standaard' query (SELECT veld1, veld2, veld3, FROM tabel) staat.
Resultaat(hier staan deze gegevens)
varchar(10)
latin1_general_ci
Is dit mogelijk om goed te tonen, of moet ik dit omvormen naar een getal? Niet dat het niet kan, maar het is wel ingewikkelder ;-)
Groeten,
Olivier
Tekst (varchar) is alles wat begint met 1 kleiner dan met 8. Als je dus wilt sorteren als getal, zul je ze ook zo moeten behandelen.
Het zijn toch ook getallen? Waarom zou je getallen (afstanden) opslaan als strings?
Even kijken hoever ik geraak tot 23 uur...
Een probleem! Ik heb resultaten van de 1000m die zien ze zo uit: 3'45"00 hoe maak ik daar een mooi getal van?
Omrekenen naar seconden en dan achter de komma de miliseconden? En dan in het script zelf terugrekenen (/60) naar minuten & seconden?
Groeten,
Olivier
Gewijzigd op 26/04/2012 22:39:52 door Olivier Peeters
Voor dit soort zaken wil ik sowieso de unix timestamp hebben werkt altijd om tot alles terug te rekenen.