Blätterfunktion & Sortieren

Hallo zusammen,

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.

[code]

<?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 } ?>
Gehe zu Seite:Erste <?php $seite = $_GET["seite"]; if(!isset($seite)) { $seite = 1; }

~Datenbankverbindung~

$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;
for($a=0; $a < $wieviel_seiten; $a++)
{
$b = $a + 1;
if($seite == $b)
{
echo ‘$b’;
}
else
{
echo " <a href="?seite=$b&schwups=$HTTP_GET_VARS[schwups]">$b ";
}

}

echo ’ Letzte’;
?>

ID Name Datum
<?php echo $line[id]; ?> <?php echo $line[name]; ?> <?php echo $line[datum]; ?>
[/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.

Hat jemand eine Idee wo mein Denkfehler liegt?

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=“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.

Hi,

Richtig - das wollte ich noch umstellen - ist nicht so arg schlimm, da es nur lokal läuft, aber dennoch sollte ich das ändern.

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

Das _GET werde ich ausprobieren - damit hatte ich bis jetzt nichts am Hut. Ich vertrau aber einfach mal darauf, dass es seinen Zweck erfüllt.

Danke für die Anregungen, ich werde alles später umsetzen und schauen was mir das Script dann meldet.

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.

Was chrisb, glaube ich, meint, ist Folgendes:

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:

Korrigiert mich, wenn ich falsch liege…

Argh, das ist natürlich verständlich - sry, da hab ich mich etwas mit dem Verständnis schwer getan… Probier das gleich mal aus.

Danke jedenfalls soweit, hoffentlich klappt das dann soweit :wink2:

naja, das ist aber richtig unsicher, Stichwort: SQL injections. Die Werte sollten zuvor noch abgesichert werden :wink:

$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 :wink:

$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… :p

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&uuml;r "schwups"');
}

Ich glaube, das ist jedem hier bekannt, der nur irgendetwas mit Entwicklung zu tun hat :wink:! (und selbst denen, dies nicht haben :smiley:)

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 :wink:

Danke jedoch trotzdem für die Bemühungen - nach außen hin würde ich das Script natürlich besser absichern :smiley:

// So, die Anführungszeichen waren’s natürlich. Jetzt klappt alles so wie es soll. Danke für die Unterstützung :winke: