Ankündigung

Einklappen
Keine Ankündigung bisher.

vorheriger / nächster DB-Eintrag

Einklappen

Neue Werbung 2019

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

  • vorheriger / nächster DB-Eintrag

    Hallo

    Ich habe eine Seite, auf der ich ein Bild aus einer DB auslesen und in Vollbild anzeigen lasse. Es sollen auch Links zum vorherigen bzw. zum nächsten Eintrag angezeigt werden. Leider funktioniert mein script nicht

    Eigentlich wollte ich nach Aufnahmedatum (ist auch in der DB vorhanden) sortieren, habe aber gelesen, dass es ein enormer Performance-Vorteil sei, nach der ID zu sortieren.

    PHP-Code:
    ... $thisresult = mysqli_query($verbindung, "SELECT * FROM images WHERE id = $id");    
            
        while ($thisrow = mysqli_fetch_assoc($thisresult)) :
            $imgname = $thisrow['name'];
            $datetime = $thisrow['datetime'];
        endwhile;
        
        $nextresult = mysqli_query($verbindung, "SELECT id FROM images WHERE id>".$id."ORDER by id DESC LIMIT 1");
        

        while ($nextrow = mysqli_fetch_assoc($nextresult)) : //hier kriege ich vermutlich ein FALSE, da die Query nicht korrekt ist. Zumindest heisst es, dass ein mysqli_result gefordert, aber ein boolean angegeben sei...
            $nextid = $nextrow['id'];
        endwhile;
    ?>
    <div style="width:70%; border:1px solid black;">
                    <img src="<?=$imgpath.$imgname?>" />
                </div>
                <div style="width:10%;border:1px solid black;">
                    <a href="fullscreen.php?id=<?=$nextid?>">
                        next
                    </a>
                </div>
    Ich bin für jeden Stubs in die richtige Richtung dankbar

  • #2
    Du musst nach dem Sortieren, was du benötigst. Nicht nach dem, was du schneller findest .

    Zudem ist SELECT * kein guter Weg. Und mittels OFFSET kannst du das bewerkstelligen, was du wünscht.
    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

    Kommentar


    • #3
      Zitat von ChristianK Beitrag anzeigen
      Du musst nach dem Sortieren, was du benötigst. Nicht nach dem, was du schneller findest ... Und mittels OFFSET kannst du das bewerkstelligen, was du wünscht.
      meinst du so?
      PHP-Code:
          $nextresult mysqli_query($verbindung"SELECT id FROM images WHERE datetime > $datetime ORDER by datetime DESC LIMIT 1 OFFSET $id");
          
          while (
      $nextrow mysqli_fetch_assoc($nextresult)) :
              
      $nextid $nextrow['id'];
          endwhile; 
      Das gibt den gleichen Fehler aus:
      Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /.../fullscreen.php on line 16

      das ist diese Zeile:
      while ($nextrow = mysqli_fetch_assoc($nextresult)) :

      Zudem ist SELECT * kein guter Weg.
      danke für den Hinweis. Aus Performancegründen? Oder gibt es da Sicherheitsbedenken?

      Kommentar


      • #4
        PHP-Code:
        echo $verbindung->error
        Das ist der Fehler um den es geht

        Kommentar


        • #5
          Zitat von Durin Beitrag anzeigen
          PHP-Code:
          echo $verbindung->error
          Das ist der Fehler um den es geht
          You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '20:15:43 ORDER by datetime DESC LIMIT 1 OFFSET 91' at line 1

          wenn ich auf den next-Link klicke, kommt folgende Fehlermeldung:
          Notice: Undefined variable: datetime in ...fullscreen.php on line 13

          aber ich weiss nicht, was ihm nicht gefällt.

          Kommentar


          • #6
            Ich würde mal `datetime` in Backticks setzen. Habe nicht nachgeschaut, könnte aber ein reserviertes Schlüsselwort sein.
            Kaum macht man's richtig, schon geht's

            Kommentar


            • #7
              Die Warnung kommt, weil Dein SQL nicht das zurückgibt, was Du erwartest.
              Wie Nullraff bereits gesagt hat, Backticks! Kann man sich auch pauschal angewöhnen.

              Zusätzlich sei noch erwähnt, daß DATETIME als String übergeben wird und $datetime somit in Quotas gehört:
              PHP-Code:
              $sQuery "SELECT `id` FROM `images` WHERE `datetime` > '$datetime' ORDER by `datetime` DESC LIMIT 1 OFFSET $id";
              $nextresult mysqli_query($verbindung$sQuery); 
              Wenn dann die Warnung immer noch besteht:
              PHP-Code:
              echo $sQuery
              und schauen, was da nicht konform sein könnte...
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Ich glaube, dass das jedoch nicht zum erwarteten Ziel führt am Schluss. Ein als Offset das $id zu nehmen bringt nicht viel, da die Primärschlüssel nicht kontinuierlich sein müssen.

                SELECT * ist nicht gut, da du unter Umständen undefinierte Array-Indexe hast (Spalte nicht mehr vorhanden), die Spalten in einer anderen Reihenfolge als in der Datenbank übermittelt werden und du viel mehr Daten ausliest als du benötigst. Zudem ist es auch eine Art Dokumentation, da ein anderer Programmierer auch weis, welche Daten du willst. Das hilft herauszufinden, was du überhaupt machen willst mit den Daten.

                Mein Ansatz, nächster Eintrag:
                Code:
                SELECT id 
                FROM images 
                WHERE `datetime` > (SELECT `datetime` FROM images WHERE id = $actualId)
                ORDER BY `datetime` ASC LIMIT 1
                vorheriger Eintrag:
                Code:
                SELECT id
                FROM images
                WHERE `datetime` < (SELECT `datetime` FROM images WHERE id = $actualId)
                ORDER BY `datetime` DESC LIMIT 1
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  Zudem ist SELECT * kein guter Weg.
                  danke für den Hinweis. Aus Performancegründen? Oder gibt es da Sicherheitsbedenken?
                  Siehe auch: http://php-de.github.io/jumpto/code-smells/#select-
                  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

                  Lädt...
                  X