ORDER BY met variabele
Beste forummers,
In een sql query wil ik graag dat order op verschillende manieren kan (bijv. op naam en op categorie)
Nu heb ik bijv. de url: http://www.mijnsite.nl/?p=test&ord=naam
Die pagina heef dit script:
Helaas trekt de query zich niets aan van dat ordenen, want de namen staann nog altijd door elkaar...
Doe ik misschien iets verkeerd, en is het sowiezo mogelijk om met een variabele in ORDER BY te werken?
In een sql query wil ik graag dat order op verschillende manieren kan (bijv. op naam en op categorie)
Nu heb ik bijv. de url: http://www.mijnsite.nl/?p=test&ord=naam
Die pagina heef dit script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$ord = ($_GET['ord']);
$sql = "
SELECT
id,
naam,
branche_id,
plaats_id
FROM
bedrijf
ORDER BY
'".mysql_real_escape_string($ord)."' ASC
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_num_rows($res) == 0)
{
echo 'Er zijn geen bedrijven gevonden.';
}
else enz... ?>
$ord = ($_GET['ord']);
$sql = "
SELECT
id,
naam,
branche_id,
plaats_id
FROM
bedrijf
ORDER BY
'".mysql_real_escape_string($ord)."' ASC
";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_num_rows($res) == 0)
{
echo 'Er zijn geen bedrijven gevonden.';
}
else enz... ?>
Helaas trekt de query zich niets aan van dat ordenen, want de namen staann nog altijd door elkaar...
Doe ik misschien iets verkeerd, en is het sowiezo mogelijk om met een variabele in ORDER BY te werken?
Moet niet tussen quotes (') staan.
Zie http://www.w3schools.com/sql/sql_orderby.asp
Zie http://www.w3schools.com/sql/sql_orderby.asp
$ord is nu uit de get 'naam'
Dus als het goed is heb je een veld dat 'naam' heet.
ORDER BY veld ASC werkt
Dus zonder enkele quotes.
Dus als je
ORDER BY '".mysql_real_escape_string($ord)."' ASC
verandert in
ORDER BY ".mysql_real_escape_string($ord)." ASC
zou het moeten werken.
Dus als het goed is heb je een veld dat 'naam' heet.
ORDER BY veld ASC werkt
Dus zonder enkele quotes.
Dus als je
ORDER BY '".mysql_real_escape_string($ord)."' ASC
verandert in
ORDER BY ".mysql_real_escape_string($ord)." ASC
zou het moeten werken.
Karl en SanThe, allebei super bedankt voor de snelle, heldere hulp!! het werkt nu inderdaad! Super!
Kijk je wel even uit voor SQL INJECTION?
User input altijd escapen
User input altijd escapen
Nog één vraagje: als ik de getallen 1 t/m 12 nu ga sorteren via ORDER BY..., dan wordt dat gesorteerd als volgt:
1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9
maar ik wil dat het er gewoon zo uit komt te zien:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Enig idee hoe ik dit kan veranderen?
1, 10, 11, 12, 2, 3, 4, 5, 6, 7, 8, 9
maar ik wil dat het er gewoon zo uit komt te zien:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Enig idee hoe ik dit kan veranderen?
Dit schijnt een manier te zijn.
Dan staan die getallen blijkbaar in een VARCHAR of zoiets.
En zijn het geen getallen meer, maar is het tekst geworden.
Een getal hoort in een veld met een type dat speciaal daarvoor is.
Bijvoorbeeld INT.
En zijn het geen getallen meer, maar is het tekst geworden.
Een getal hoort in een veld met een type dat speciaal daarvoor is.
Bijvoorbeeld INT.
Bedankt opnieuw Karl en SanThe.
Karl, die oplossing werkt uitstekend, maar ik begrijp dus dat ik het verkeerde veld heb gekozen. Ik ga het direct aanpassen. bedankt beide!
Karl, die oplossing werkt uitstekend, maar ik begrijp dus dat ik het verkeerde veld heb gekozen. Ik ga het direct aanpassen. bedankt beide!
Was toevallig net bezig met zoiets:
Is zoiets als dit met een paar kleine aanpassingen een toevoeging aan de lib?
Code (php)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?
#Weer te geven naam => kollom
$tablehead = array('Naam' => 'name','Achternaam' => 'lastname','' => 'middlename', 'Geboortedatum' => 'birthday');
# Toegestane kollomen voor orderby functie
$allowed = array('name','lastname','e-mail','birthday');
# controleer de $_GET waarden.
if(!empty($_GET['order_by']) && in_array($_GET['order_by'],$allowed)){
$orderby = $_GET['order_by'];
}else{
$orderby = "name";
}
if(!empty($_GET['dir']) && ($_GET['dir'] == 'ASC' || $_GET['dir'] == 'DESC')){
$dir = $_GET['dir'];
$contradir = ($dir=="DESC"?"ASC":"DESC");
$arrow = ($dir=="DESC"?"down":"up");
}else{
$dir = "ASC";
$contradir = "DESC";
$arrow = "down";
}
# dump alle data in array $a_data;
$a_data=array();
$query = mysql_query("SELECT * FROM table ORDER BY ".$orderby." ".$dir);
while($data = mysql_fetch_assoc($query)){
$a_data[] = $data;
}
$table = "<table>\n<tr>\n";
# maak een tablehead met alle kollomen
foreach($tablehead as $name => $column){
$table.="<td>";
# als kollom orderby toegestaan is, voeg dan een linkje toe
if(in_array($column,$allowed)){
# als kollom orderby is en tevens al geselecteerd: voeg plaatje toe met richting.
if($column == $orderby){
$table .= "<a href='pagina.php?order_by=".$column."&dir=".$contadir."'>".$name."</a> <img src='image/arrow_".$arrow.".gif' alt='*'>";
}else{
$table .= "<a href='pagina.php?order_by=".$column."&dir=".$dir."'>".$name."</a>";
}
}else{
$table .= $name;
}
$table.="</td>\n";
}
$table.="</tr>\n";
# maak voor elke row een eigen <tr>
foreach($a_data as $data){
$table.="<tr>\n";
# maak voor elke eigenschap een eigen <td>
foreach($tablehead as $var){
$table.= '<td>'.$data[$var].'</td>';
}
$table.="</tr>\n";
}
$table.="</tr>\n</table>";
?>
#Weer te geven naam => kollom
$tablehead = array('Naam' => 'name','Achternaam' => 'lastname','' => 'middlename', 'Geboortedatum' => 'birthday');
# Toegestane kollomen voor orderby functie
$allowed = array('name','lastname','e-mail','birthday');
# controleer de $_GET waarden.
if(!empty($_GET['order_by']) && in_array($_GET['order_by'],$allowed)){
$orderby = $_GET['order_by'];
}else{
$orderby = "name";
}
if(!empty($_GET['dir']) && ($_GET['dir'] == 'ASC' || $_GET['dir'] == 'DESC')){
$dir = $_GET['dir'];
$contradir = ($dir=="DESC"?"ASC":"DESC");
$arrow = ($dir=="DESC"?"down":"up");
}else{
$dir = "ASC";
$contradir = "DESC";
$arrow = "down";
}
# dump alle data in array $a_data;
$a_data=array();
$query = mysql_query("SELECT * FROM table ORDER BY ".$orderby." ".$dir);
while($data = mysql_fetch_assoc($query)){
$a_data[] = $data;
}
$table = "<table>\n<tr>\n";
# maak een tablehead met alle kollomen
foreach($tablehead as $name => $column){
$table.="<td>";
# als kollom orderby toegestaan is, voeg dan een linkje toe
if(in_array($column,$allowed)){
# als kollom orderby is en tevens al geselecteerd: voeg plaatje toe met richting.
if($column == $orderby){
$table .= "<a href='pagina.php?order_by=".$column."&dir=".$contadir."'>".$name."</a> <img src='image/arrow_".$arrow.".gif' alt='*'>";
}else{
$table .= "<a href='pagina.php?order_by=".$column."&dir=".$dir."'>".$name."</a>";
}
}else{
$table .= $name;
}
$table.="</td>\n";
}
$table.="</tr>\n";
# maak voor elke row een eigen <tr>
foreach($a_data as $data){
$table.="<tr>\n";
# maak voor elke eigenschap een eigen <td>
foreach($tablehead as $var){
$table.= '<td>'.$data[$var].'</td>';
}
$table.="</tr>\n";
}
$table.="</tr>\n</table>";
?>
Is zoiets als dit met een paar kleine aanpassingen een toevoeging aan de lib?




