ich hab mal wieder ein kleines Problemchen, das ich nicht ganz nachvollziehen kann.
Folgender Sachverhalt: Ich lasse verschiedene Daten aus einer Datenbank-Tabelle ausgeben. Dabei soll eine Blätterfunktion verwendet werden, sodass je Seite 50 Datensätze angezeigt werden. Zudem möchte ich beim Klick auf die jeweilige Tabellen-Überschrift, dass die Datensätze aufsteigend sortiert werden. Hierzu werden per URL seite=n und schwups=spaltenname übergeben, sodass sich etwa sowas ergibt: script.php?seite=1&schwups=id
Hier der Code-Snippet:
Ich hab alle unwichtigen Teile entfernt, die nur die Anzeige beeinflussen, etwa Schriftformatierungen.
<?php
$query = "SELECT * FROM tabelle ORDER BY '$HTTP_GET_VARS[schwups]' ASC LIMIT $start,$eintraege_pro_seite";
$result = mysql_query($query);
while ($line = mysql_fetch_array($result)) {
?>
<?php echo $line[id]; ?>
<?php echo $line[name]; ?>
<?php echo $line[datum]; ?>
<?php } ?>
[/code]
Die Daten werden nach aufsteigend nach ID sortiert ausgegeben, auch die Blätterfunktion funktioniert hervorragend. Allerdings funktioniert die Sortierung nach schwups nicht. schwups wird richtig übergeben, ein echo ergibt das richtige Ergebnis. Jedoch will sich die Liste zum Verrecken nicht neu sortieren, sondern bleibt hartnäckig nach ID geordnet stehen.
mit Anführungsstrichen heissen sollte…?
Wieso verwendest du eigentlich nicht einfach $_GET[‘schwups’]?
Du solltest aber unbedingt den Inhalt dieser Variablen überprüfen, ob sie einen korrekten Wert hat.
Ansonsten ist das ganze relativ leicht zu hacken…
[quote=“samo”]hmm, könnte es daran liegen, dass es
mit Anführungsstrichen heissen sollte…?
Wieso verwendest du eigentlich nicht einfach $_GET[‘schwups’]?
Du solltest aber unbedingt den Inhalt dieser Variablen überprüfen, ob sie einen korrekten Wert hat.
Ansonsten ist das ganze relativ leicht zu hacken…[/quote]
Hi,
danke erstmal für die Antwort.
$HTTP_GET_VARS[schwups] funktioniert so einwandfrei. Lasse ich die Variable per echo ausgeben wird auch der entsprechende Wert, etwa name ausgegeben. Ich werde es jedoch alternativ mal mit GET probieren - obwohl ich nicht glaube, dass es daran liegt.
Zu Hacken ist das Teil schlichtweg unmöglich - es liegt lokal auf meinem Rechner und ist nur im lokalen Netzwerk erreichbar.
$eintraege_pro_seite = 50;
$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;
$result = mysql_query("SELECT $HTTP_GET_VARS[schwups] FROM tabelle");
$menge = mysql_num_rows($result);
$wieviel_seiten = $menge / $eintraege_pro_seite;
Du liest hier erst mal alle Datensätze aus, das ist unperformant, wenn es nur darum geht, die Anzahl zu ermitteln - dazu solltest du COUNT() verwenden.
Damit sortierst du effektiv gar nicht - weil du hier einen String als Sortierkriterium angibst, und keinen Spaltennamen.
Und $HTTP_GET_VARS solltest du wirklich nicht mehr verwenden, sondern $_GET. Ersteres funktioniert derzeit zwar noch, wenn register_long_arrays auf on steht; diese Option wird in PHP 6 aber komplett entfallen, und damit alle $HTTP_xyz_VARS auch.
Der String, den ich übergebe ist der Spaltenname Die Spalten heißen id, name und datum - genau das übergebe ich ja auch - bspw.
?schwups=name[/quote]
Nein, du hast in deiner SQL-Query einen SQL-String eingesetzt - und damit ist es eben kein Spaltenname, sondern reiner Text.
Mit den Anführungsstrichen um $HTTP_GET_VARS[schwups] sagst du MySQL, dass das Text ist, und es nichts zu interpretieren gibt…
eigentlich müsste das doch so sein:
naja, das ist aber richtig unsicher, Stichwort: SQL injections. Die Werte sollten zuvor noch abgesichert werden
$order_by = mysql_real_escape_string($_GET['schwups']);
$start = intval($start); //nicht unbedingt nötig, da durch Rechnung weiter oben schon umgewandelt, aber sicher ist sicher.
$eintraege_pro_seite = intval($eintraege_pro_seite); // nicht unbedingt nötig, da fest im Skript defniert
$query = "SELECT * FROM tabelle ORDER BY $order_by ASC LIMIT $start,$eintraege_pro_seite";
[quote=„progandy“]naja, das ist aber richtig unsicher, Stichwort: SQL injections. Die Werte sollten zuvor noch abgesichert werden
$order_by = mysql_real_escape_string($_GET['schwups']);
$start = intval($start); //nicht unbedingt nötig, da durch Rechnung weiter oben schon umgewandelt, aber sicher ist sicher.
$eintraege_pro_seite = intval($eintraege_pro_seite); // nicht unbedingt nötig, da fest im Skript defniert
$query = "SELECT * FROM tabelle ORDER BY $order_by ASC LIMIT $start,$eintraege_pro_seite";[/quote]
Hab ich auch schon gesagt…
Wie wär’s mit etwas in der Art:
switch ($HTTP_GET_VARS[schwups]) {
case 'id':
break;
case 'name':
break;
case 'datum':
break;
default:
die('Falscher Parameter für "schwups"');
}
Nochmal - ich lass das Teil hier lokal laufen und die zugriffe erfolgen von sage und schreibe 3 Rechnern - da ist die Sicherheit relativ egal. Ich möchte das Script nicht unnötig aufblasen und eine Prüfung auf gültige Parameter und dergleichen mehr einbauen - die URLs werden sowieso nicht angezeigt oder im Browser aufgerufen sondern über ein entsprechendes Interface das nur Klicks erlaubt - und in meinem Programm gibt es eben nur die 3 Möglichkeiten: Richtig, richtig oder richtig. ansonsten funktioniert das Script eben nicht und gibt nix zurück
Danke jedoch trotzdem für die Bemühungen - nach außen hin würde ich das Script natürlich besser absichern
// So, die Anführungszeichen waren’s natürlich. Jetzt klappt alles so wie es soll. Danke für die Unterstützung