PHP/MySQL Sorteren kolommen via url

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey mensen, ik ben aan het kloten met PHP en Mysql en wilde via variabelen in de url kolommen laten sorteren op de pagina pagina.php. Dit heb ik zover:

$query_Recordset1 = "SELECT * FROM leden Order By $sort $order"; als query

Dit als extra code eronder:

<?php
if (isset($_GET['sort'])){
$sort = $_GET['sort'];
}
else {
$sort = 'naam';
}

if (isset($_GET['order'])){
$order = $_GET['order'];
}
else {
$order = 'ASC';
}
?>

En als linkje:
pagina.php?sort=naam&order=DESC

Dan krijg ik een error die volgens mij slaat op m'n repeat region, maar wil nog wel eens veranderen:

You have an error in your SQL syntax near 'LIMIT 0, 10' at line 1, terwijl er geen LIMIT 0, 10 in regel 1 staat.. Dus ergens zit een foutje, kan iemand zien of die hierboven staat?

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Echo je query eens ipv dat je hem uit voert en ga eens wat lezen over SQL Injection Attacks :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Je hebt dus eerst de query met $sort en $order erin, en pas daarna geef je $sort en $order een waarde? Dat gaat natuurlijk niet werken ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • rb338
  • Registratie: Januari 2001
  • Laatst online: 05-01 12:58
Doe inderdaad, voordat je verder ook maar _iets_ doet, wat gorgi_19 zegt.
Je stelt mensen nu namelijk in staat om je query volledig aan te passen wat je database (en jij dus ook) niet leuk gaat vinden.

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Ik had het even gehad met mijn eigen (lastigere php probleem), dus eventjes voor dit 'probleem' een simpel scriptje gemaakt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// .... rest van je code ......

// Waar mag op gesorteerd worden
$aSortOptions = array( 'naam', 'plaats', '...' );

// Heeft $_GET['sort'] een waarde, en klopt die waarde. Zo ja
// dan gaan we die gebruiken, anders de standaard (naam) gebruiken
if( isSet( $_GET['sort'] ) && in_array( $_GET['sort'], $aSortOptions ) )
    $sSort = $_GET['sort'];
else
    $sSort = "naam";

// Heeft $_GET['order'] een waarde? Zo ja, is dat DESC of ASC
if( isSet( $_GET['order'] ) && $_GET['order'] == "DESC" )
    $sOrder = "DESC";
else
    $sOrder = "ASC";

// Voeg de waardes toe aan de Query
$query = sprintf( "SELECT * FROM `leden` ORDER BY %s %s", $sSort, $sOrder );

// ....... nog meer code .....

[ Voor 14% gewijzigd door OkkE op 04-03-2005 16:21 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Alvast bedankt voor deze verlichtende reacties, ik heb weer wat stof tot nadenken... Wordt vervolgd!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het geheel werkend gekregen, hier wat ik heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$sortoptions = array('maandlijsten.Naam', 'groep', 'debet', 'email', 'Tebetalen', 'DESC', 'ASC');

if (isset($_GET['sort']) && in_array( $_GET['sort'], $sortoptions)){
$sort = $_GET['sort'];
}
else {
$sort = 'maandlijsten.Naam';
}

if (isset($_GET['order']) && in_array( $_GET['sort'], $sortoptions)){
$order = $_GET['order'];
}
else {
$order = 'ASC';
}

$query = "SELECT Tebetalen as debet, leden.naam as naam, leden.email as email, 
leden.groep as groep FROM leden, maandlijsten ORDER BY $sort $order";

if ($order == "ASC") {
$linksort = "DESC";
}
else {
$linksort = "ASC";
}

Links worden dan ...?sort=var&order=<?php echo $linksort ?>
Eventueel commentaar kan gepost worden (ik kan goed tegen kritiek).

[ Voor 20% gewijzigd door Verwijderd op 06-03-2005 16:13 ]


Acties:
  • 0 Henk 'm!

  • TeasingU
  • Registratie: Juni 2001
  • Laatst online: 15-09-2022

TeasingU

I Live Longer

if (isset($_GET['sort'])){
$sort = $_GET['sort'];
}

Om de beveiliging op te schroeven:

if (isset($_GET['sort'])){
$sort = addslashes($_GET['sort']);
}

Op die manier voorkom je sql injection. Hier lees je er meer over:
http://www.phpfreakz.nl/artikelen.php?aid=106&page=4

cd /usr/ports/www/porn make install


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Kheb op php.net dit gevonden over addslashes:

string addslashes ( string str)


Geeft een string weer met backslashes voor characters die moeten worden gequote in database queries etc. Deze characters zijn single quote ('), double quote ("), backslash (\) en NUL (de NULL byte)

Maar veel wijze wordt ik er niet van, wat doet die addslashes precies en hoe werkt het?

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
TeasingU schreef op zondag 06 maart 2005 @ 16:15:
if (isset($_GET['sort'])){
$sort = addslashes($_GET['sort']);
}
Beter gebruik je daar een database-specifieke functie voor, addslashes escaped namelijk niet alles wat MySql graag escaped wil zien.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Precies wat je zegt. Stel je hebt een sql query: update table set field = '$var'; Als $var dan de waarde 123'456 zou bevatten, dan loopt dat uit op een sql syntax error, omdat de string al wordt afgebroken. Als hierop niet gecontroleerd wordt kan iemand vrij snel sql injection toepassen. Dat houdt in dat de waarde voor een input variabel dan sql bevat kan daarmee schade aangericht worden. Stel dat de waarde dan '; DROP TABLE tabel; is oid, dan heb je dus een probleem. Ook kun je last krijgen als je een waarde voor javascript genereert oid.

[ Voor 7% gewijzigd door Michali op 06-03-2005 19:26 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dus met addslashes controleert tie de ingevoerde waardes, zodat het lastiger is met je database te fucken. Oke duidelijk, bedankt!

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Gebruik liever mysql_real_escape_string(), zoals PrisonerOfPain al zegt :) . (Let dan wel op gpc_magic_quotes) .

DM!


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Je bent alsnog vulnerable voor SQL Injection:
PHP:
1
2
3
4
5
6
if (isset($_GET['order']) && in_array( $_GET['sort'], $sortoptions)){
$order = $_GET['order'];
}
else {
$order = 'ASC';
}

Dat helpt helemaal niks, alleen $order op ASC zetten als het niet geset is. Waarom kijk je daar weer of sort wel in sortoptions staat? Volgens mij begrijp je je eigen code niet helemaal. Als je nu een geldige sort opgeeft kan je alsnog gewoon dingen toevoegen aan de query via order.
Maak er iig zoiets van:
PHP:
1
2
3
4
if ((isset($_GET['order'])) && (($_GET['order'] == 'ASC') || ($_GET['order'] == 'DESC')))
  $order = $_GET['order'];
else
  $order = 'ASC';

[ Voor 25% gewijzigd door Radiant op 07-03-2005 10:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, bedankt, overigens ben je wel een ( vergeten bij if ((isset...
Maar dat is bijzaak.
Pagina: 1