ORDER BY met variabele
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?
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!
User input altijd escapen
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.
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.
Karl, die oplossing werkt uitstekend, maar ik begrijp dus dat ik het verkeerde veld heb gekozen. Ik ga het direct aanpassen. bedankt beide!
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?