ORDER BY met variabele

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Anne

Anne

07/03/2009 16:58:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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... ?>


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?
 
PHP hulp

PHP hulp

26/12/2024 01:26:39
 

07/03/2009 17:00:00
Quote Anchor link
Moet niet tussen quotes (') staan.
Zie http://www.w3schools.com/sql/sql_orderby.asp
 
- SanThe -

- SanThe -

07/03/2009 17:02:00
Quote Anchor link
$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.
 
Anne

Anne

07/03/2009 17:06:00
Quote Anchor link
Karl en SanThe, allebei super bedankt voor de snelle, heldere hulp!! het werkt nu inderdaad! Super!
 
Klaasjan Boven

Klaasjan Boven

07/03/2009 17:14:00
Quote Anchor link
Kijk je wel even uit voor SQL INJECTION?

User input altijd escapen
 
Anne

Anne

07/03/2009 17:27:00
Quote Anchor link
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?
 

07/03/2009 17:29:00
Quote Anchor link
Dit schijnt een manier te zijn.
 
- SanThe -

- SanThe -

07/03/2009 17:33:00
Quote Anchor link
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.
 
Anne

Anne

07/03/2009 17:35:00
Quote Anchor link
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!
 
Pieter van Linschoten

Pieter van Linschoten

07/03/2009 18:04:00
Quote Anchor link
Was toevallig net bezig met zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
#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."&amp;dir=".$contadir."'>".$name."</a>&nbsp;<img src='image/arrow_".$arrow.".gif' alt='*'>";
        }
else{
            $table .= "<a href='pagina.php?order_by=".$column."&amp;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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.