Antworten auf deine Fragen:
Neues Thema erstellen

Probleme mit "order by..."

xxxsharkyxxx

Siebenschläfer

Hallo, hab da ein kleines Problem: Ich hab eine Tabelle mit 6 Spalten. Die Tabelle ist die Ausgabe einer Datenbank-Tabelle. In jeder dieser 6 Spalten ist pro Datensatz ein Wert eingetragen. Nun möchte ich, dass der Besucher wählen kann, nach welchem der 6 Kriterien die Tabelle geordnet ist. Also er klickt dann z.B. auf "Name" und die Tabelle soll dann alphabetisch nach dem Namen geordnet werden. Oder er klickt auf "Punktzahl" und die Tabelle wird nach dem Kriterium Punktzahl geordnet. Hier mal das bisherige Script, damit das ein bisschen besser verständlich ist:

PHP:
<?php
            mysql_connect(localhost, name, *pass*);
            mysql_select_db("db");
            
            $res = mysql_query("select * from db");
            $num = mysql_num_rows($res);
            
            echo "<table border>";
            echo "<b><tr><td>Name</td><td>Flottenpunkt</td><td>Koordinaten</td><td>Verlust</td><td>Datum</td><td>Autor des Eintrags</td></tr></b>";
            $lf = 1;
            while ($dsatz = mysql_fetch_assoc($res))
            {
                echo "<tr>";
                echo "<td>" . $dsatz["name"] . "</td>";
                echo "<td>" . $dsatz["flotte"] . "</td>";
                echo "<td>" . $dsatz["koord1"] . ":" . $dsatz["koord2"] . ":" . $dsatz["koord3"] . "</td>";
                echo "<td>" . $dsatz["verlust"] . "</td>";
                echo "<td>" . $dsatz["datum"] . "</td>";
                echo "<td>" . $dsatz["autor"] . "</td>";
                echo "</tr>";
                $lf = $lf + 1;
            }
            echo "</table>";
        ?>
Ich hab im Moment noch gar keine Sortierung drin. Das Problem ist, dass der "Order by"-befehl variabel sein muss. Meine einzige lösung wäre 6 verschiedene Seiten zu machen und dann auf diese Seiten zu verlinken. Wobei die Tabelle auf jeder Seite anders geordnet ist. Allerdings geht das sicher einfacher denke ich...
Kann mir wer helfen?

grüsse sharky
 

Top_Gun

Aktives Mitglied

AW: Probleme mit "order by..."

Meine einzige lösung wäre 6 verschiedene Seiten zu machen und dann auf diese Seiten zu verlinken. Wobei die Tabelle auf jeder Seite anders geordnet ist.
Ahhhhh viel zu kompliziert gedacht ;)

Allerdings geht das sicher einfacher denke ich...
Kann mir wer helfen?
Ja und ja...

Benutz eine GET-Variable um den Wert für dein order zu übergeben ähnlich dem:
PHP:
<?php
if(isset($_GET["order"]) && $_GET["order"] != "") {
$order = $_GET["order"];
} else {
$order = "name";
}

            mysql_connect(localhost, name, *pass*);
            mysql_select_db("db");
            
            $res = mysql_query("select * from db order by ".$order);
            $num = mysql_num_rows($res);
            
            echo "<table border>";
            echo "<b><tr><td>Name</td><td>Flottenpunkt</td><td>Koordinaten</td><td>Verlust</td><td>Datum</td><td>Autor des Eintrags</td></tr></b>";
            $lf = 1;
            while ($dsatz = mysql_fetch_assoc($res))
            {
                echo "<tr>";
                echo "<td>" . $dsatz["name"] . "</td>";
                echo "<td>" . $dsatz["flotte"] . "</td>";
                echo "<td>" . $dsatz["koord1"] . ":" . $dsatz["koord2"] . ":" . $dsatz["koord3"] . "</td>";
                echo "<td>" . $dsatz["verlust"] . "</td>";
                echo "<td>" . $dsatz["datum"] . "</td>";
                echo "<td>" . $dsatz["autor"] . "</td>";
                echo "</tr>";
                $lf = $lf + 1;
            }
            echo "</table>";
        ?>
 

r3nt5ch3r

~ Allround pG ~

AW: Probleme mit "order by..."

Das Problem ist, dass der "Order by"-befehl variabel sein muss. Meine einzige lösung wäre 6 verschiedene Seiten zu machen und dann auf diese Seiten zu verlinken.

Zum Glück sind Variablen nicht variabel... xD

alsoo:

PHP:
$sortBy = isset($_GET['sortBy']) ? $_GET['sortBy'] : '';
switch($sortBy){
   case 'name':
   case 'flotte':
   case 'verlust':
   case 'datum':
   case 'autor': break;
   case 'koord': $sortBy = 'koord1'; break;
   default: $sortBy = 'name';
}

$res = mysql_query("select * from db ORDER BY ".$sortBy);
//...

(untested stellt aber die Logik dar)
Jetzt musst du nur noch die Tabellenköpfe mit dem entsprechenden Get-Paramter verlinken...

mfg

@Top_Gun: poste hier lieber nicht so ein Müll! Deine Version ist eine willkommene Sql-Injection...
 
Zuletzt bearbeitet:

Top_Gun

Aktives Mitglied

AW: Probleme mit "order by..."

poste hier lieber nicht so ein Müll!
Meine ist weniger Müll als deine, aber aus dem Alter bin ich raus, also brech ich hier ab.


Deine Version ist eine willkommene Sql-Injection...
Stimmt... und da ich nichts anderes in meinem Leben zu tun habe als hier Wasserdichte Quellcodes für andere Leute zu programmieren ist dies ein unverzeihlicher Fehler für den ich gesteinigt werden muss.
Wer also ohne Sünde ist, werfe den ersten...
 

Christian

verpeilt & verschallert

AW: Probleme mit "order by..."

Leuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuteeeeee da brennen mir ja die augen!!

Niemals mysql_real_escape_string() vergessen.
Bzw. Ein SortBy-Statement über switch-case lösen!
 

r3nt5ch3r

~ Allround pG ~

AW: Probleme mit "order by..."

Niemals mysql_real_escape_string() vergessen.
Bzw. Ein SortBy-Statement über switch-case lösen!

Hmm hört sich so an als wäre "mysql_real_escape_string" ohne switch-case sicher?!
Iich geh mal davon aus, dass magic_quotes aktiv sind und die $_POST, $_GET usw nicht aktiv "gestripslashed" wurden^^)
 
Zuletzt bearbeitet:
C

caddy

Guest

AW: Probleme mit "order by..."

Die erste Lösung ist nicht falsch, aber wirklich gefährlich und nicht zu empfehlen.
Die 2te gefällt mir, wieder was dazu gelernt !!!

Danke schön !!

Gruesse,
Caddy

P.S. Aber man hätte auch dezenter auf das Injection Problem hinweisen können...
 
G

gimp_fussel

Guest

AW: Probleme mit "order by..."

Hallo,
wie es aussieht sind grundsätzliche Programmierkenntnisse (PHP) vorhanden! Die Verbindung zur Datenbank funktioniert und die Fragestellung ist auch klar: Der User soll die Möglichkeit erhalten, die Daten nach seinen Wünschen sortieren zu lassen. Dazu muss nur die Query zur Datenbank angepasst werden (ORDER BY evt. in Verbindung mit DESC/ASC --> aufsteigen(Standard)/absteigend).
Nun brauch nur noch eine Auswahlmöglichkeit geschaffen werden und ich denke, dass man dies einfach über ein select-Tag realisieren kann:
Code:
<form action="deineseite.php" method="POST">
  <p>
    <select name="sortBy" size="1">
      <option value='name' selected='selected'>Name</option>
      <option value='flotte'>Flotte</option>
      <option value='datum'>Datum</option>
      <option value='koord1'>Koord1</option>
      <option value='verlust'>Verlust</option>
      <option value='autor'>Autor</option>
    </select>
    <input type='submit' name='submit' value='Auswahl abschicken' />
  </p>
</form>
(Ich achte jetzt nicht auf valides HTML)
Oben in der Seite wird nun der schon gepostete PHP-Abschnitt (<?php blablub ?>)
eingefügt und auf die Auswahl des select-Tags hin die Abfrage gestartet
(und natürlich 'mysql_real_escape_string()' um die POST-Variable drumgebastelt).

PHP:
if(isset($_Post["submit"]{ //oder if(isset($_POST["submit_x"])) bei Image_Button
    if(isset($_POST["sortBy"])) {
        $sortBy=mysql_real_escape_string($_POST["sortBy"]);
    }
 function dbconnect($datenbank="deindatenbankname",$host="127.0.0.1",$benutzer="root",$passwd="deinpasswort"){   
  $db_link = mysql_connect($host,$benutzer,$passwd,TRUE) or die mysql_error());
   mysql_select_db($datenbank);
   if(!$db_link) echo "Fehler DB-Verbindung";

}

$dbconnect = dbconnect();

$sql_query = "SELECT *
                   FROM deinetabelle
                   ORDER BY $sortBy"; //eventuell noch aufsteigend /absteigend
$res = mysql_query($sql_query);
 
echo "<table>";
echo "<tr><td>Name</td><td>Flottenpunkt</td><td>Koordinaten</td><td>Verlust</td><td>Datum</td><td>Autor des Eintrags</td></tr>";

$anzahl_daten_pro_datensatz = 0;

if(mysql_num_rows($res) > 0) {
   while($data = mysql_fetch_row(res)) {
 
      echo "<tr>";
      for($i = 0; $i < count($data); $i++) {
           if (($zaehler%6)==0) $bg = '#DDF1EE'; 
           if (($zaehler%12)==0)$bg = '#FFFFFF';
           echo = "<td style='background:$bg'>$data[$i]</td>";
           $anzahl_daten_pro_datensatz++;
        }
         echo = "</tr>";
    }
}
else {
    echo "<tr><td colspan='6'>Es sind noch keine Daten vorhanden!</td></tr>";
}

echo = "</table>";
}
}
Habe ich schnell runter getippt, sollte aber so in etwa funktionieren. Ich hoffe, es hilft Dir etwas.

Gruß gimp_fussel
 
Zuletzt bearbeitet:

r3nt5ch3r

~ Allround pG ~

AW: Probleme mit "order by..."

@gimp_fussel auch hier gibts wieder dieselbe Sql-Injection, da kannste noch so viel escapen xD

(schöner als über Select zu sortieren, wäre eine Verlinkung des Tabellenkopfes)

€dit: eigentlich wären auch noch die XSS-Lücken erwähnenswert (aber sind bisher bei allen Beispielen)^^
 
Zuletzt bearbeitet:
G

gimp_fussel

Guest

AW: Probleme mit "order by..."

@gimp_fussel auch hier gibts wieder dieselbe Sql-Injection, da kannste noch so viel escapen xD

(schöner als über Select zu sortieren, wäre eine Verlinkung des Tabellenkopfes)

... eine 100%-Sicherheit gibt es nie! Aber da der User nur eine Auswahl hat und kein Eingabefeld, sollte es schon so funktionieren. Natürlich kann man in der heutigen Zeit auch schnell Eingaben vornehmen (Firebug), aber ich denke so ist die Datenbank schon mal etwas gegen Injections abgesichert ... wir wollen es hier nicht übertreiben (aber ist natürlich ein wichtiges Thema!!!).

... na klar, noch besser könnte man es über Ajax realisieren. Einfach nur mit der Maus über den jeweiligen Tabellenkopf-Eintrag gleiten und die Daten werden automatisch nachgeladen :muede:!

Immer aufm Teppich bleiben!:)

Gruß gimp_fussel
 

r3nt5ch3r

~ Allround pG ~

AW: Probleme mit "order by..."

... eine 100%-Sicherheit gibt es nie! Aber da der User nur eine Auswahl hat und kein Eingabefeld, sollte es schon so funktionieren.

du solltest aber wenigstens über die 5%-Hürde kommen (ich finde es wichtig auf so etwas stärker aufmerksam zu machen, da der Großteil der Websiten echt eine Katastrophe darstellt und mit so etwas würde man das auch noch "unterstützen")

... na klar, noch besser könnte man es über Ajax realisieren. Einfach nur mit der Maus über den jeweiligen Tabellenkopf-Eintrag gleiten und die Daten werden automatisch nachgeladen !

Das ist Quatsch, mein Vorschlag galt nur der besseren Usability... deiner der sinnfreien Übertreibung xD
 
G

gimp_fussel

Guest

AW: Probleme mit "order by..."

Ok,

Du hast recht ... und entschuldige meine sinnlose Übertreibung!
Das mit dem Tabellenkopf hat mich aber inspiriert, meine Tabellen
noch mal zu überdenken!
Wünsche noch ein schönes WE!

Gruß
gimp_fussel

EDIT: Im oberen Quellcode muss die $_POST["sortBy"] natürlich nach dem Öffnen der Datenbank mit
gestrippt werden. Zudem kann man noch HTML-Tags rausziehen etc.!
 
Zuletzt bearbeitet:
C

caddy

Guest

AW: Probleme mit "order by..."

Also die XSS Lücken fänd ich schon interessant.... Könntest du das erläutern ??
 

r3nt5ch3r

~ Allround pG ~

AW: Probleme mit "order by..."

Also die XSS Lücken fänd ich schon interessant.... Könntest du das erläutern ??

klaro^^

PHP:
echo "<td>" . $dsatz["name"] . "</td>";

gehen wir mal davon aus, dass man eine Flotte so nennen kann wie man will. Dann könnte man sie beispielsweise "<script>alert('javaScript!');</script>" nennen, um so JavaScript Code einzuschleusen. Das gefährlichste dabei ist die Möglichkeit Cookies zu klauen, was alles über JavaScript sehr leicht möglich ist.

Richtig:
PHP:
echo "<td>" . htmlspecialchars($dsatz["name"]) . "</td>";

Was htmlspecialchars genau macht kannste dir ja sicher denken, ansonsten -> PHP: htmlspecialchars - Manual
Die Funktion sollte man bei JEDER Ausgabe anwenden, die nicht dazu gedacht ist HTML auszugeben (falls HTML ausgegeben wird, darauf achten, dass solche Angriffe nicht möglich gemacht werden)!
 
Zuletzt bearbeitet:
C

caddy

Guest

AW: Probleme mit "order by..."

Ahhh ja. Aber mit striptags beim speichern, sollte die XSS Attacke ins Leere gehen, oder ??

Vielen dank ^^
 

r3nt5ch3r

~ Allround pG ~

AW: Probleme mit "order by..."

Ahhh ja. Aber mit striptags beim speichern, sollte die XSS Attacke ins Leere gehen, oder ??

Ja, aber leider auch alle anderen Tags weshalb das nicht zu empfehlen ist^^ Also ein eventueller Informations/Datenverlust kann durchaus entstehen...
 
C

caddy

Guest

AW: Probleme mit "order by..."

Naja, da sehe ich aber in erster Linie ein Problem für Mail/Forensoftware. Dort ist sicherlich Freitext erwünscht und gewollt. Aber für "normale" Datenfelder ist es sicherlich wünschenswert keinen HTML Code in der DB zu speichern...
 

r3nt5ch3r

~ Allround pG ~

AW: Probleme mit "order by..."

Naja, da sehe ich aber in erster Linie ein Problem für Mail/Forensoftware. Dort ist sicherlich Freitext erwünscht und gewollt. Aber für "normale" Datenfelder ist es sicherlich wünschenswert keinen HTML Code in der DB zu speichern...

Das "normalste" Datenfeld hat dort den Datentyp "varchar" oder "text", dem ist es relativ egal was da drin steht^^

€dit: oftmals wird der Text davor aber schon mit "BB-Code-Platzhaltern" bearbeitet und entschärft, sodass da am Ende auch schon eine Version mit htmlspecialchars() drinne steht die auch so ohne Probleme ausgegeben werden kann
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.614
Beiträge
1.538.351
Mitglieder
67.525
Neuestes Mitglied
mgtaucher
Oben