[PHP] Query samenstellen uit meerdere dropdown menu's

Pagina: 1
Acties:
  • 438 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een pagina met 5 dropdown menu's waarin keuzes gespecificeerd kunnen worden. Zodra er op submit gedrukt wordt dan zullen de $_POST waardes van deze keuzes in de query worden gestopt en komt er zo een resultaat uit, dat werkt prima.

Nu wil ik graag een optie in -elke- dropdown met de waarde "Alles". Ik krijg dit alleen niet in mijn query gevouwen. Als option value had ik de keuze Alles eerst leeggelaten maar dan zoekt de query gewoon alleen de records waar dat veld leeg is. Daarna was ik met IF statements aan de gang gegaan, bijvoorbeeld:

code:
1
2
3
4
5
if ($_POST['Klas'] == "Alle klassen")
{
$variabele
$de kwerie van die variabele
}


Nu is het probleem alleen dat ik 5 dropdown menu's heb waar dus op 25 verschillende manieren een "Alles" waarde kan worden geselecteerd. Moet ik nou 25 if statements gaan inbouwen met 25 verschillende queries of is dit eenvoudiger op te lossen?

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
SQL:
1
2
3
4
5
6
7
8
SELECT
*
FROM
table
WHERE
(klas = '$_POST["klas"]' OR '$_POST["klas"]' = 'Alle klassen')
AND
...


ik weet dat het niet de bedoeling is om kant en klaar de oplossing te voeren, maar ik kon even niet snel bedenken hoe ik dit moest omschrijven

[ Voor 39% gewijzigd door P.O. Box op 04-01-2008 15:05 ]


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 16:37
Je kan de query opbouwen op basis van ingevulde $_POST variabelen. Als een $_POST variabele een waarde bevat waar je op wilt zoeken dan voeg je 'm toe aan de sql query:

PHP:
1
2
3
4
5
$sql = "SELECT * FROM tabel WHERE 1=1";
if ($_POST['Klas'] != 'Alle Klassen') {
    $sql .= " AND klas = '{$_POST['Klas']}' ";
}
// enz enz


Dit is sql injectie gevoelig maar ik ga er van uit dat je daar wel rekening mee houdt.

[ Voor 31% gewijzigd door Kalentum op 04-01-2008 15:11 ]


Acties:
  • 0 Henk 'm!

  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 13:48

ThunderNet

Flits!

Kun je in php niet net als in .net parameters toevoegen? Dit om sqlinjection te voorkomen.

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


Acties:
  • 0 Henk 'm!

  • Exception
  • Registratie: Augustus 2006
  • Laatst online: 17-09 11:10
Houdt er wel rekening mee dat dit uiterst mysqlinjection-gevoelig is. Wanneer er een stuk SQL gezet wordt in de post, kan ben de hele query veranderen.

Acties:
  • 0 Henk 'm!

  • Blaise
  • Registratie: Juni 2001
  • Niet online
Dat kan je oplossen door de array/functie/klasse waarmee je de dropdownbox opties vult, ook te gebruiken om te checken of de $_POST waarde geldig is. Op die manier kan je veilig een SQL query opbouwen. zonder dat gebruikers zelf kunnen klooien.

[ Voor 9% gewijzigd door Blaise op 04-01-2008 15:32 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
rutgerw schreef op vrijdag 04 januari 2008 @ 15:06:
Je kan de query opbouwen op basis van ingevulde $_POST variabelen. Als een $_POST variabele een waarde bevat waar je op wilt zoeken dan voeg je 'm toe aan de sql query:

PHP:
1
2
3
4
5
$sql = "SELECT * FROM tabel WHERE 1=1";
if ($_POST['Klas'] != 'Alle Klassen') {
    $sql .= " AND klas = '{$_POST['Klas']}' ";
}
// enz enz


Dit is sql injectie gevoelig maar ik ga er van uit dat je daar wel rekening mee houdt.
Deze oplossing heb ik gebruikt en werkt perfect. Sql injectie maakt in dit geval niet zoveel uit want het is toch voor eigen gebruikt.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
ThunderNet schreef op vrijdag 04 januari 2008 @ 15:07:
Kun je in php niet net als in .net parameters toevoegen? Dit om sqlinjection te voorkomen.
Tuurlijk, gewoon sprintf doen :) Staat trouwens ook als direct voorbeeld bij de documentatie.

TS: wellicht kan het geen kwaad toch even naar escapen te kijken, ware het alleen al omdat anders aanhalingstekens / quotes fout gaan zodra je een keer geen magic_quotes_gpc hebt :) Zelf geef ik trouwens doorgaans de voorkeur aan een associatieve array met als keys de mogelijke zoekopties en als waarden de velden die daar bij horen, dan weet je tenminste zeker dat alleen door jou voorgedefinieerde zoekopdrachten uitgevoerd kunnen worden (en voorkom je dus dat een % bijvoorbeeld je zoekopdracht veel te groot maakt).

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

FragFrog, mysql_real_escape i.c.m. sprintf is wel iets heel anders dan het gebruik van geparametriseerde queries hoor, al komt 't qua veiligheid redelijk in de buurt.

Je gunt dan alleen de database niet de kans om een query te optimaliseren, omdat iedere query anders is. Bij geparametriseerde queries kan 'ie tenminste z'n statistics bijwerken. Maar ik weet niet of MySQL z'n execution plan optimaliseert op basis van de statistics, dus misschien is 't een non-issue...

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

PDO is een goede klasse om sqlinjection te voorkomen.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Verwijderd schreef op zaterdag 05 januari 2008 @ 02:39:
FragFrog, mysql_real_escape i.c.m. sprintf is wel iets heel anders dan het gebruik van geparametriseerde queries hoor, al komt 't qua veiligheid redelijk in de buurt.
Ik bedoelde eigenlijk ook qua veiligheid, je hebt natuurlijk gelijk dat het geen echte geparametriseerde queries zijn. Dat kan voor zover ik weet wel met de MySQLi extensie (en PDO) maar die is lastiger in gebruik en wordt niet overal ondersteunt :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

FragFrog schreef op zaterdag 05 januari 2008 @ 14:23:
[...]

Ik bedoelde eigenlijk ook qua veiligheid, je hebt natuurlijk gelijk dat het geen echte geparametriseerde queries zijn. Dat kan voor zover ik weet wel met de MySQLi extensie (en PDO) maar die is lastiger in gebruik en wordt niet overal ondersteunt :)
Buiten het feit dat PDO niet overal ondersteund is, is er toch niets moeilijk aan?
PHP:
1
2
3
4
5
6
$db = new PDO(...);
$stmt = $db->prepare("SELECT * FROM tabel WEHERE id = ?");
$stmt->bindParam(1, &$_POST['id'], PDO::PARAM_INT);
$stmt->execute();

$lijst = $stmt->fetchAll();

Moelijk?

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Snake schreef op zaterdag 05 januari 2008 @ 14:29:
Buiten het feit dat PDO niet overal ondersteund is, is er toch niets moeilijk aan?
Moelijk?
Moeilijker dan mysql_query, al was het alleen maar om het feit dat je geen procedural style code kan gebruiken ;) Iemand die al moeite heeft met variabelen escapen gaat gok ik weinig begrijpen van de PDO functies :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

FragFrog schreef op zaterdag 05 januari 2008 @ 14:37:
[...]

Moeilijker dan mysql_query, al was het alleen maar om het feit dat je geen procedural style code kan gebruiken ;) Iemand die al moeite heeft met variabelen escapen gaat gok ik weinig begrijpen van de PDO functies :)
Mmmm 'kej agree, maar helaas moet het goed worden gedaan, en dat is gewoonweg een barriere die overwonnen (geleerd) moet worden, anders is het een vergiet qua veiligheid.

Going for adventure, lots of sun and a convertible! | GMT-8

Pagina: 1