• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] Sortierung

Dominic28

Mitglied
Hallo,
Ich möchte den Usern die Möglichkeit geben Inhalt nach Auswahlmöglichkeiten zu sortieren. Bisher habe ich das gelöst indem ich mit Hilfe von <select> eine ID an PHP übergebe und diese in einem Array einen Text darstellt, welcher dann an die MySQL-Abfrage angehängt wird.

PHP:
$q = $_GET["q"];

$sort = array(
    "1" => "ORDER BY...",
    "2" => "ORDER BY...",
    "3" => "ORDER BY...",
    "4" => "ORDER BY...",
);

$sql = "SELECT irgendwas FROM tabelle ". $sort[$q] ."";

Allerdings kommt mir das viel zu umständlich und hässlich vor. Das kann man doch bestimmt ordentlicher lösen oder? Vieleicht mit Prepared Statements?
 
Werbung:
Mit einem Dropdown-Feld vielleicht?

HTML:
<select size="1" name="auswahl">
   <option value="id">ID</option>
   <option value="name">Name</option>
   <option value="plz">Postleitzahl</option>
</select>

<select size="1" name="aufab">
   <option value="ASC">aufsteigend</option>
   <option value="DESC">absteigend</option>
</select>

PHP:
<?php
$sql = "SELECT * FROM table ORDER BY '".$_POST['auswahl']."' ".$_POST['aufab']." ";
?>

Nils aka XraYSoLo
 
Okay, ist ja quasi das selbe. Du übergibst bei dir nur direkt den Text und ich ne Zahl, welcher dann der Text zugeordnet wird.
Ist deine Version dann nicht unsicherer?
 
Werbung:
Wenn es per $_GET übergeben wird, musst du das noch gegen Injections sichern.

Das sollte man nicht nur bei Werte tun, die per GET übergeben wurden, sondern bei jeglichen Userinputs die verarbeitet werden, auch bei POST!
Schliesslich kann man auch POST-Daten manipulieren. (Dies solltest du als Moderator eigentlich wissen ;) )
 
Werbung:
Also ist es hierbei doch sicherer wenn ich nur eine zahl übergebe (mit $_POST) und die mit nem array abgleiche, oder?

PHP:
if(is_numeric($_POST["id"])) {
    $q = $_POST["id"];
} else {
    $q = "1";
}

$sort = array(
    "1" => "ORDER BY...",
    "2" => "ORDER BY...",
    "3" => "ORDER BY...",
);
 
Schenkt sich nichts. Du kannst ja auch direkt auf die Werte innerhalb des array zugreifen und musst es nicht erst abgleichen.

Nils aka XraYSoLo
 
Aber so kann doch niemand die Abfrage verändern wenn ich generell per $_POST nur Zahlen annehme und denen den Text zurordne?
 
Werbung:
Du solltest auch überprüfen, ob die Zahl in dem Array auch existiert.

XraYSoLos Erklärungen und Tipps sind auch nicht gerade sehr korrekt. In seinem Beispiel schützt escape_string gegen gar nichts. htmlentities (oder besser htmlspecialchars) schützen nicht nur gegen Designschaden sondern nebenher auch noch gegen wirklich gefährliche Dinge wie XSS-Angriffe. htmlspecialchars() sollte man aber nicht beim Schreiben in die Datenbank benutzen, sondern nach dem Lesen aus der Datenbank, wenn man HTML ausgibt.
Sein Beispiel im ersten Beitrag ist übrigens SQL-Injection-anfällig.
 
Okay,
Das aus dem ersten Beitrag ist auch schon geschichte.
Kann ich meins jetzt so lassen wie im letzten Beitrag von mir?
 
Werbung:
Dann hoffe ich mal, dass das hier richtig ist:

PHP:
if(is_numeric($_POST["id"])) {
    $q = $_POST["id"];
    
    if(in_array($q, $sort) {
        $q = $q;
    } else {
        $q = "1";
    }
} else {
    $q = "1";
}

$sort = array(
    "1" => "ORDER BY...",
    "2" => "ORDER BY...",
    "3" => "ORDER BY...",
);
 
Auch nicht.
1) Du überprüfst nicht, ob effektiv $_POST['id'] existiert.
2) $sort ist noch gar nicht definiert, wenn du in_array benutzt.
[3) is_numeric solltest du besser durch ctype_digit ersetzen, das ist in dem Fall korrekter, da du keine Kommazahlen und negative Zahlen akzeptierst.]
 
Neuer Versuch:
PHP:
$sort = array(
    "1" => "ORDER BY...",
    "2" => "ORDER BY...",
    "3" => "ORDER BY...",
);  

if(ctype_digit($_POST["id"])) {
    $q = $_POST["id"];
    
    if(!in_array($q, $sort) {
        $q = "1";
    }
} else {
    $q = "1";
}

Das versteh ich nicht ganz:
1) Du überprüfst nicht, ob effektiv $_POST['id'] existiert.

Ich guck doch ob $_POST['id'] eine Zahl ist und falls ja, ist $q diese Zahl. Danach guck ich ob die Zahl in dem Array zu finden ist und falls nicht ist $q automatisch 1.

Die anderen beiden Sachen sind einleuchtend. Danke dafür!
 
Werbung:
Achso. Du meintest das so?
PHP:
$sort = array(
    "1" => "ORDER BY...",
    "2" => "ORDER BY...",
    "3" => "ORDER BY...",
);

if(isset($_POST["id"])) {
    if(ctype_digit($_POST["id"])) {
        $q = $_POST["id"];

        if(!in_array($q, $sort) {
            $q = "1";
        }
    } else {
        $q = "1";
    }
} else {
    $q = "1";
}
 
Nein, hatte mir das nicht ganz durchgelesen. in_array überprüft nicht, ob ein Schlüssel existiert, sondern ob ein Wert im Array existiert. In deinem Fall reicht das:

PHP:
$q = "1";
if (isset($_POST["id"]) && isset($sort[$_POST["id"]])) {
    $q = $_POST["id"];
}
 
Werbung:
Zurück
Oben