Mit PHP Daten aus einer MySQL-DB fischen und als Tabelle ausgeben

  • Ich bin ja nun wirklich nicht der geborene Programmierer und schlage mich irgendwie so durch. Allerdings komme ich gerade nicht weiter - vermutlich in einem recht frühen Stadium. :topmodel:

    Was habe ich vor? Ich habe alle meine MTB-Trainingsdaten in eine MySQL-DB geschoben und möchte mir diese Daten anzeigen lassen.
    Das klappt so weit auch. Allerdings will ich ich noch zweite weitere Dinge:

    • Nach den einzelnen Spalten sortieren
    • Ganz am Ende einiger Spalten soll eine Summe oder ein Durchschnitt angezeigt werden.

    Kann mir da jemand weiterhelfen?

  • Das mit der Sortierung ist sehr simpel. Dazu änderst du einfach das SQL Query ab. Statt...

    Code
    SELECT * FROM aktivitaet ORDER BY ID DESC

    ...ist es dann eben nach Distanz aufsteigend sortiert ein...

    Code
    SELECT * FROM aktivitaet ORDER BY Distanz ASC

    Wenn du das dynamisch auswählbar machen willst, mußt noch HTTP Variablen und damit HTML Buttons/Forms verwenden. Nehmen wir an dein Script heißt "lala.php". So ein HTML Drop Down Menü plus "OK" Button könnte dann z.B. sich selbst mit neuen HTTP Vars aufrufen, z.B. die URL "lala.php?sortby=Distanz&order=ASC".

    In PHP kannst diese Variablen einfach abrufen, indem du den Inhalt der HTTP GET Vars ausliest (die in der URL stehen) und bei deren Vorhandensein dementsprechende lokale Variablen auf deren Inhalt oder bei Fehlen der Variable auf einen Standardwert setzt, dazu hier Mal ein paar häßliche Blitz-Ifs:

    Code
    $_GET['sortby'] ? $sortby = $_GET['sortby'] : $sortby = "ID";$_GET['order'] ? $order = $_GET['order'] : $order = "DESC";

    Hier wird die lokale Variable $sortby auf den Inhalt der HTTP Var sortby gesetzt. Gibt es keine HTTP Var dieses Namens (z.B. beim Erstaufruf von lala.php), dann wird der Sortierer auf "ID" gesetzt. Selbiges passiert mit der Variable $order, ermittelt aus der HTTP Var order. Fehlt diese, nehmen wir pauschal absteigende Sortierung an.

    Dann kannst sowas machen:

    Code
    $select = "SELECT * FROM aktivitaet ORDER BY " . $sortby . " " . $order;$result = mysql_query($select,$db);

    So wird dein SELECT Query dynamisch zusammengebaut/erweitert, je nachdem welche Werte du per HTML Formular angefordert hast. Wenn du gar nichts übermittelst, sortiert er standardgemäß nach absteigender ID.

    Jetzt mußt dir nur noch dein HTML Formular dazu basteln, das sollte recht simpel sein. :)

    Keine Garantie auf Funktion des Codes, sind vielleicht Syntaxfehler drin, nur grad so runtergefetzt.

    Edit: Durchschnitt ist auch simpel, das geht komplett in SQL:

    SQL
    SELECT AVG(Geschwindigkeit_D) FROM aktivitaet

    Selbsterklärend. Und SUM() gibt's in SQL auch noch:

    SQL
    SELECT SUM(Distanz) FROM aktivitaet

    Sehr simple Arithmetik brauchst nicht in PHP zu lösen, das macht MySQL selber, und es rechnet sogar deutlich schneller!

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

    9 Mal editiert, zuletzt von GrandAdmiralThrawn (25. Februar 2015 um 18:00)

  • Ha - danke! =)
    Kann mein Gelumpe jetzt sortieren und bin ein ganzes Stück weiter.

    Da ich noch nicht weiß, ob ich in diesem Jahr doch mal wieder einen steten Trainingspartner haben werde, der mich im Zweifel auch mal motiviert, will ich ich vorbereitet sein.
    Letztes Jahr bin ich quasi "gegen" meine alten Daten in einer Excel-Tabelle gefahren und das hat ausgezeichnet funktioniert.

    Will das aber nun nach und nach zu einem "Reportcenter" ausbauen und dann auch Spaß an den aufbereiteten Daten haben.
    Dank der Sortierung weiß ich jetzt, dass 17 der 20 schnellsten Trainings im Jahr 2014 stattgefunden haben. Das geht in connect.garmin.com zwar auch, das ist aber ziemlich lahm.

  • Nice!

    Diesen ganzen Sport muß man ja auch durch ein wenig nachts-vorm-Rechner-sitzen-und-coden ausgleichen, sonst verliert man noch den wichtigen Ausgleich! :spitze:

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Mit dem Code oben hast Du Dir vermutlich gleich eine SQL-Injection gebaut. Bitte niemals ungefiltert GET-Variablen an die Datenbank durchreichen, das bedeutet de facto Vollzugriff für jeden gewieften Nutzer Deiner Applikation.

    Mindestens sollten die Parameter escapet werden: http://php.net/manual/de/func…cape-string.php

    (Ich denke Du nutzt die Anwendung nur alleine - aber ich finde man sollte aus Prinzip immer mit Sicherheitsaspekten im Hinterkopf programmieren.)

    We are Microsoft of Borg. Assimilation is imminent. Resistance is... Error in Borg.dll. Press OK to abort.

  • Die Adresse der Seite ist ausschließlich mir bekannt und ich will das Verzeichnis noch mit einem Kennwort sichern.
    Deinen Link werde ich mir dennoch mal auf die Leseliste setzen.

  • Mit dem Code oben hast Du Dir vermutlich gleich eine SQL-Injection gebaut. Bitte niemals ungefiltert GET-Variablen an die Datenbank durchreichen, das bedeutet de facto Vollzugriff für jeden gewieften Nutzer Deiner Applikation.

    Da hast du natürlich Recht. Allerdings ist in diesem Fall der schwerstmögliche Angriff ein Information Leak, aber immerhin noch kein Username Leak o.ä., weil er ohnehin nur in die gegebenen SELECTs injecten kann. Und der, der auf die Seite zugreifen kann, hat sowieso Zugriff auf die kompletten Daten dieser DB.

    Stimmen tut's natürlich trotzdem, man sollte sich das von Haus aus nicht angewöhnen. Bin halt auch kein echter PHP Coder, noch nicht Mal annähernd, sollte man dazusagen. ;)

    Edit: Der Datenbankuser sollte btw. für Oberflächen auf denen nur Daten gelesen werden auch tatsächlich nur Leserechte auf die DB selbst haben. So mache ich das zumindest immer. Wo keine Dateneingabe passiert, da muß der DB User ja auch keine Schreibrechte haben. So kann man schon Mal einfach alle Modifikationen oder Vernichtungen verhindern.

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

    Einmal editiert, zuletzt von GrandAdmiralThrawn (26. Februar 2015 um 08:40)

  • So, hab mir das Mal etwas angesehen, und ich denke, es gibt einen sehr einfachen Weg, die Injection abzuwehren (Das Escaping ist auch nie perfekt, grade rausgefunden!). Sofern es nicht zwingend nötig ist, Strings an die Datenbank durchzureichen (wie z.B. bei einer Volltextsuche), kann man auch parameterisierte Abfragen sein lassen und einfach alles durch if/switch lösen und gar nichts direkt durchreichen:

    Das fängt alles ab, und setzt Standardwerte wenn irgendwas unbekanntes daherkommt. Ist etwas mehr Code, fängt Injections über HTTP Vars aber zu 100% ab denke ich.

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Jup! :spitze:
    Geht noch eleganter, aber so ist man auf jeden Fall ganz safe.

    We are Microsoft of Borg. Assimilation is imminent. Resistance is... Error in Borg.dll. Press OK to abort.

  • Bin für elegantere Vorschläge offen (soferne Ernesto nicht dagegen ist, seinen Thread zu hijacken ;)), nur PDO o.ä. ist hier evtl. zuviel.

    Lernen ist niemals falsch, eh?

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Eine einfache Möglichkeit Deinen Switch zu verkürzen:

    Code
    switch ($_GET['sortby']) {  case "dauer":  case "climb":  case "Geschwindigkeit_D":  case "Geschwindigkeit_Max":  case "Puls_D":  case "Puls_Max":  case "Kalorien":    $sortby = $_GET['sortby'];  break;  default:    $sortby = "distanz";}

    (Man beachte die weggelassenen breaks zum "Durchfallen-Lassen".)


    Andere Lösung:

    Code
    $allowedSorts = array("dauer", "climb", "Geschwindigkeit_D", "Geschwindigkeit_Max", "Puls_D", "Puls_Max", "Kalorien");  if(in_array($_GET['sortby'], $allowedSorts)) {    $sortby = $_GET['sortby'];  } else {    $sortby = "distanz";  }


    Oder gar:

    Code
    $allowedSorts = array("dauer", "climb", "Geschwindigkeit_D", "Geschwindigkeit_Max", "Puls_D", "Puls_Max", "Kalorien");
      $sortby =  (in_array($_GET['sortby'], $allowedSorts)) ? $_GET['sortby'] : "distanz";

    (Letzte Zeile ist eine Kurzform von der if-Verzweigung drüber)

    We are Microsoft of Borg. Assimilation is imminent. Resistance is... Error in Borg.dll. Press OK to abort.