Ankündigung

Einklappen
Keine Ankündigung bisher.

Differenz zwischen aktueller Zeile und letzter Zeile

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Differenz zwischen aktueller Zeile und letzter Zeile

    Hallo,

    ich seh aktuell den Wald vor lauter Bäumen nicht mehr.
    Folgende PHP Seite habe ich:

    PHP-Code:
      <?php
                    
    require 'config.php';
                    try {
                        
    $conn = new PDO("mysql:host={$servername};dbname={$dbname};charset=utf8",$username,$password);

                    
    $sql"SELECT
                            id,
                            km_stand,
                            distanz
                            FROM Verbrauch"
    ;

                   
    $daten $conn->prepare($sql);
                   
    $daten->execute();
                    echo 
    '
                        <article>
                        <table class="table table-striped" cellpadding="0" cellspacing="0" border="0" width="100%">
                          <thead>
                            <tr>
                              <th>ID</th>
                              <th>KM Stand</th>
                              <th>Distanz</th>
                              <th></th>
                            </tr>
                          </thead>'
    ;


                     while (
    $row $daten->fetch(PDO::FETCH_ASSOC))
                     {
                      echo 
    "<tr>";

                      echo 
    "<td>"$row['id'] . "</td>";
                      echo 
    "<td>"$row['km_stand'] . "</td>";
                      echo 
    "<td>"$row['distanz'] . "</td>";
                      echo 
    "</tr>";

                    }
                    }
                    catch(
    PDOException $e)
                     {

                      echo 
    "Error: " $e->getMessage();
                     }
                      
    $conn null;

                    echo 
    "</table>";

                    
    ?>
    Wie man sieht wird der eingegebene KM Stand in einer Tabelle ausgegeben. Ich möchte jetzt mittels SQL Abfrage aber auch noch die Distanz vom letzten KM Stand zum aktuellen KM Stand berechnen. Eigentlich dachte ich, dass das ein einfaches unterfangen ist, ich komm aber nicht drauf.

    Mein Zugang jetzt wäre schon gewesen, dass ich einfach den aktuellen KM Stand * 2 berechne und dann mit einem verketteten SQL Statement die höchsten 2 KM Stände ausgebe, zusammenrechne und dann vom doppelten KM Stand abziehe. Das Ergebnis ist natürlich das gleiche, als wenn ich direkt B - A berechnen würde. ABER ... das geht natürlich immer nur für den letzten Eintrag in der DB gut weil er mir ja bei den anderen Zeilen dann auch immer das gleiche Ergebnis liefern würde.

    Ich suche jetzt also eine Möglichkeit, dass ich mit SQL irgendwie tatsächlich die letzte Zeile von der vorletzten Zeile subtrahieren kann. Mit MySQL. Nein ich habe nicht die Möglichkeit auf PostgreSQL zu wechseln.
    Es gibt dazu schon ein paar halbwegs passende Fragen, aber nie wirklich Antworten habe ich das Gefühl.

  • #2
    Zitat von dieManu Beitrag anzeigen
    Ich suche jetzt also eine Möglichkeit, dass ich mit SQL irgendwie tatsächlich die letzte Zeile von der vorletzten Zeile subtrahieren kann. Mit MySQL. Nein ich habe nicht die Möglichkeit auf PostgreSQL zu wechseln.
    Okay.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      - wähle die Datensätze aus kleineren Kilometerstand haben als der aktuell betrachtete Datensatz. (WHERE)
      - sortiere nach dem Kilometerstand (SORT BY)
      - limitiere auf einen Datensatz (LIMIT)

      Kommentar


      • #4
        das artet in einer ganzen Serie vonSQL-Statements aus, die an den Server gehen. Sobald die Anzahl der Datensätze da eine signifikante Größe erreicht, wird das von der Performance her mit Wucht gegen die Wand fahren. Aber egal, not my department.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Wenn es nur wenige Datensätze sind die ausgegeben werden, kannst du das auch mit PHP lösen.

          Kommentar


          • #6
            Zitat von protestix Beitrag anzeigen
            Wenn es nur wenige Datensätze sind die ausgegeben werden, kannst du das auch mit PHP lösen.
            aktuell gehe ich von ~ 36 einträgen im Jahr aus. Sollte also nicht so viel sein, noch dazu will ich nicht alle immer ausgeben.
            PHP hätte ich mir auch schon gedacht, bin dann aber ebenfalls daran gescheitert

            Kommentar


            • #7

              Schau dir bitte das "EVA-Prinzip" an. Dein DB-Connect inmitten der HTML-Ausgabe hat da nichts verloren. https://php-de.github.io/jumpto/eva-prinzip/

              Weiters behandelst du den Ausgabekontext zu HTML nicht korrekt. Das ist eine Fehlerquelle und mögliche XSS-Lücke. htmlspecialchars() nutzen!
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                Zitat von hausl Beitrag anzeigen
                Schau dir bitte das "EVA-Prinzip" an. Dein DB-Connect inmitten der HTML-Ausgabe hat da nichts verloren. https://php-de.github.io/jumpto/eva-prinzip/

                Weiters behandelst du den Ausgabekontext zu HTML nicht korrekt. Das ist eine Fehlerquelle und mögliche XSS-Lücke. htmlspecialchars() nutzen!
                danke, werd ich mir mal anschauen. ich dachte immer, dass htmlspecialchars() nur für eingaben relevant sind. In dem Fall ist es ja nur eine einfache Ausgabe. Aber ich werd mich dem Thema nochmals annehmen.

                Ich habe es übrigens jetzt so gelöst:

                Code:
                SELECT
                    t1.id,
                    t1.notizen,
                    t1.km_stand, 
                    (t1.km_stand - MAX(t2.km_stand)) AS differenz
                    FROM Verbrauch t1
                    LEFT JOIN Verbrauch t2 ON ( t2.km_stand < t1.km_stand )
                    GROUP BY t1.km_stand

                Kommentar


                • #9

                  t1.id, und t1.notizen gehören auch ins GROUP BY, ansonsten ist die Abfrage falsch auch wenn Mysql das ohne Fehlermeldung akzeptiert.

                  Kommentar


                  • #10
                    ich dachte immer, dass htmlspecialchars() nur für eingaben relevant sind.
                    Ganz im Gegenteil. Für den Kontextwechsel (~ die Ausgabe) nach HTML hin und sonst nichts. Wenn du das auf Eingaben anwendes verstümmelst du dir ev. sogar die DAten und hast dann MIst in der DB.
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Hier noch der Link zum Handbuch und zum Thema Kontextwechsel allgemein.

                      Kommentar

                      Lädt...
                      X