Ankündigung

Einklappen
Keine Ankündigung bisher.

Seitenzahl im Gästebuch - Es werden alle Beiträge pro Seite ausgegeben

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Seitenzahl im Gästebuch - Es werden alle Beiträge pro Seite ausgegeben

    Hallo zusammen,

    ich habe zu meinem Gästebuch eine Seitenzahl-Funktion hinzugefügt. Anfangs hatte ich noch 1,2 Errors, die konnte ich jedoch beseitigen. Nun ist mein Problem, dass bei jeder Seitenzahl ALLE Beiträge ausgegeben werden, obwohl ich nur 10 Pro Seite haben möchte. Leider wird mir kein Error ausgegeben, sodass ich nicht auf anhieb erkenne, was das Problem ist. Vielleicht kann mir ja einer von euch weiterhelfen? Anbei findet ihr den Code:

    PHP-Code:
     <?php

              ini_set
    ('display_errors'1);
              
    ini_set('display_startup_errors'1);
              
    error_reporting(E_ALL);

        if(!isset(
    $_SESSION))
        {
            
    session_start();
        }

             include (
    'dbconnection.php');
             include 
    'checklogin.php';
             include 
    'head_nav.html';
             include 
    'kontakt.html';
      
    ?>

    <!DOCTYPE HTML>                                                                                          
    <html lang="de">                                              
        <head>

            <link rel="stylesheet" href="css/normalize.css">
            <link rel="stylesheet" href="css/style.css">

        </head>

        <body>

            <form action="" method="post">
                <p>Betreff:</p>
                <input type="text" name="betreff" placeholder="Betreff?"><br>
                <p>Nachricht:</p>
                <textarea name="nachricht" placeholder="Ihre Nachricht!"></textarea><br>
                <input type="submit" name="submit" value="Absenden!"><br>
            </form>

      <?php

            array_walk 
    $_POST,    'cleanmsg' );
            
    array_walk $_GET,     'cleanmsg' );
            
    array_walk $_REQUEST'cleanmsg' );

            function 
    cleanmsg(&$value$key)
            {
                
    // keine HTML-Tags erlaubt, außer p und br
                
    $value strip_tags($value'<p><br /><b><strong>');

                
    // HTML-Tags maskieren
                
    $value htmlspecialchars($valueENT_QUOTES);

                
    // Leerzeichen am Anfang und Ende beseitigen
                
    $value trim($value);
            }

                if(isset(
    $_POST['submit'])):
                    
    $betreff $_POST['betreff'];
                    
    $nachricht $_POST['nachricht'];
                    
    $userid $_SESSION['user'];                
                    
    $StrSQL "INSERT INTO kontakt (userid_fk,betreff,nachricht,datum)
                    VALUES (?,?,?,NOW())"
    ;                                                
                    
    $absenden $db->prepare($StrSQL);                      
                    
    $absenden->bind_param('iss'$userid$betreff$nachricht);
                    
    $absenden->execute();
                endif;

                
    $StrSQL2 "SELECT users.benutzername as bn,
                kontakt.betreff, kontakt.nachricht, kontakt.datum
                FROM users RIGHT JOIN kontakt
                ON users.userid = kontakt.userid_fk ORDER BY datum DESC"
    ;  

                
    $abfrage $db->query($StrSQL2);  

                echo  
    'Es wurden '.$abfrage->num_rows.' Nachrichten gefunden!<br>';

                while (
    $ausgabe $abfrage->fetch_object()){
                echo 
    '
                <b>Benutzer:</b> ' 
    . (!is_null($ausgabe->bn) ? $ausgabe->bn 'Gast' ). '<br>'.
                
    '<b>Datum:</b> ' $ausgabe->datum ' <br>'.
                
    '<b>Betreff:</b> ' $ausgabe->betreff ' <br>'.
                
    '<b>Nachricht:</b><br> ' $ausgabe->nachricht ' <br>
                <hr>'
    ;
            }

                
    $result_total mysqli_query($db,'SELECT COUNT(*) as `total` FROM kontakt');
                
    $row_total mysqli_fetch_assoc($result_total);
                
    $gesamte_anzahl $row_total['total'];

                
    $ergebnisse_pro_seite 10;
                
    $gesamt_seiten ceil($gesamte_anzahl/$ergebnisse_pro_seite);

                if (empty(
    $_GET['seite_nr'])) {
                    
    $seite 1;
                    } else {
                        
    $seite $_GET['seite_nr'];
                if (
    $seite $gesamt_seiten) {
                    
    $seite 1;
            }
        }

            
    $limit = ($seite*$ergebnisse_pro_seite)-$ergebnisse_pro_seite;
            
    $result mysqli_query($db,'SELECT `nachricht` FROM `kontakt` LIMIT '.$limit.', '.$ergebnisse_pro_seite);
            while (
    $row mysqli_fetch_assoc($result)) {

        }

        for (
    $i=1$i<=$gesamt_seiten; ++$i) {
            if (
    $seite == $i) {
                echo 
    '<a href="kontakt.php?seite_nr='.$i.'" style="font-weight: bold;">'.$i.'</a>';
            } else {
                echo 
    '<a href="kontakt.php?seite_nr='.$i.'">'.$i.'</a>';
            }
        }

        include 
    'footer.html';  

    ?>            
    </body>
    </html>

  • #2
    Der Code ist leider ein komplettes Durcheinander. Beachte das EVA-Prinzip und vermische Datenbankabfragen nicht mit HTML-Ausgaben. Desweiteren solltest du nicht englische und deutsche Sprache vermischen (einmal "result", einmal "anzahl"), sowas macht den Code auch nicht lesbarer. Und der Code sollte auch sauber eingerückt sein.

    Je unlesbarer der Code ist, desto weniger Leute werden sich die Mühe machen den Code überhaupt anzuschauen.

    Kommentar


    • #3
      Ergänzend dazu:
      Deine Funktion cleanmsg macht zudem mehr als der Name verrät. Wenn du eine Funktion hast, die cleanmsg heisst und welche die Eingaben aus einem Formular bereinigen soll, dann sollte die Ausgabe(return) die bereinigte Message sein oder im Fehlerfall ein false, jedoch mehr nicht. Du hast da zudem Ausgaben drin in Form von echo, die in deiner Funktion ebenso wenig rein gehören wie die schon erwähnten Datenbankabfragen.

      Kommentar


      • #4
        Zitat von hellbringer Beitrag anzeigen
        Der Code ist leider ein komplettes Durcheinander. Beachte das EVA-Prinzip und vermische Datenbankabfragen nicht mit HTML-Ausgaben.
        Das wüßte ich jetzt gerne noch etwas genauer: Ich verstehe das jetzt erstmal so, daß es nicht einen dauernden Wechsel von DB-Ausgaben und HTML geben soll. Oder?

        Oder ist gemeint, daß einfach in eine Funktion keine "Echo" reingehören? Das wäre dann ja eigentlich schon "trivial klar".

        Im Falle, daß aber doch gemeint ist, "daß es nicht einen dauernden Wechsel von DB-Ausgaben und HTML geben soll": Wie sollte dann am besten sowas verarbeitet (EVA) und ausgegeben (EVA) werden:
        1. Situation: Auf der Website sollen schlußendlich zwei Artikel stehen: a. ein Text mit Überschriften und Zwischenüberschriften b. eine Tabelle.
        2. Auf der Datenbank ist zu beiden Artikeln ALLES gespeichert: Text, Formatierungen (also was Überschrift Level 1, 2, ... sein soll, was einfacher Absatz; Spaltenbreiten für die Tabellen, Tabellenüberschriften etc. pp), einfach alles.
        3. Nun "baut" unser hypothetischer Hobbyentwickler, "richtiger" Entwickler, Student (wie sharete ) etc. folgendes: 1. Funktion: gibt anhand der Infos auf der DB einen vollständigen HTML-Code für den Artikel aus. 2. Funktion: gibt anhand der Infos auf der DB einen vollständigen HTML-Code für die Tabelle aus.
        Frage: In diesem Fall wechselt doch auch DB-Abfrage mehrfach mit HTML-Ausgabe. Wie gesagt: Die Funktionen enthalten kein echo, sondern geben lediglich den HTML-code zurück:
        PHP-Code:
        <?php
          
        // ...
        ?>
        <!DOCTYPE HTML>
        <html lang="DE">
          <head>
            <!-- ... -->
          </head>
          <body>
            <div class="sidebar1">
              <!-- bla -->
            </div> <!-- ende .sidebar1 -->
            <div class="content">
              <div class="c_artikel">
        <?php
                
        echo fnc_StrCArtikel(2);
        ?>
              </div> <!-- ende .c_artikel -->
              <div class="c_tabelle">
        <?php
                
        echo fnc_StrCTabelle(3);
        ?>
              </div> <!-- ende .c_Tabelle -->
              <div class="stat_text">
                <!-- bla -->
              </div> <!-- ende .stat_text -->
            </div> <!-- ende .content -->
          </body>    
        <html>
        Wie aber sollte man das dann ändern?


        Desweiteren solltest du nicht englische und deutsche Sprache vermischen (einmal "result", einmal "anzahl"), sowas macht den Code auch nicht lesbarer. Und der Code sollte auch sauber eingerückt sein.

        Je unlesbarer der Code ist, desto weniger Leute werden sich die Mühe machen den Code überhaupt anzuschauen.
        Sehr wahr!

        Kommentar


        • #5
          Frage: In diesem Fall wechselt doch auch DB-Abfrage mehrfach mit HTML-Ausgabe. Wie gesagt: Die Funktionen enthalten kein echo, sondern geben lediglich den HTML-code zurück:
          Erst die Daten holen, dann die Ausgabe starten. Damit bist du flexibler im Umgang mit unerwarteten Fehlern.

          Stell dir vor du hast 5 Artikel und arbeitest die wie in deinem Beispielcode ab. Beim dritten Artikel tritt ein Fatal Error oder eine Exception auf weil... die Datenbank abgestürzt ist.
          Selbst wenn du den Fehler oder die Exception per Try-Catch auffängst kannst du in dem Moment nicht mehr gut reagieren - weil du die ersten Ausgaben bereits rausgehauen hast (Header already sent).

          Wenn du zuerst die Daten zusammen sammelst und dabei an irgend einer Stelle etwas schief läuft, kannst du einfach auf eine Fehlerseite umleiten.
          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

          Kommentar


          • #6
            Irgendwie hat das Forum meinen geposteten Eintrag geschluckt. Daher diesmal nur die Kurzfassung:

            Thema kompliziert. Am besten sich bestehende Frameworks anschauen. Diese verwenden in der Regel das MVC-Architekturmustur. Interessanter Artikel zu dem Thema:

            http://openbook.rheinwerk-verlag.de/...tektur_001.htm

            Kommentar


            • #7
              Zitat von VPh Beitrag anzeigen
              Erst die Daten holen, dann die Ausgabe starten. Damit bist du flexibler im Umgang mit unerwarteten Fehlern.

              Stell dir vor du hast 5 Artikel und arbeitest die wie in deinem Beispielcode ab. Beim dritten Artikel tritt ein Fatal Error oder eine Exception auf weil... die Datenbank abgestürzt ist.
              Selbst wenn du den Fehler oder die Exception per Try-Catch auffängst kannst du in dem Moment nicht mehr gut reagieren - weil du die ersten Ausgaben bereits rausgehauen hast (Header already sent).

              Wenn du zuerst die Daten zusammen sammelst und dabei an irgend einer Stelle etwas schief läuft, kannst du einfach auf eine Fehlerseite umleiten.
              Also, vorweg: Im Normal-Fall gibt es bei mir immer (programmiere im Moment noch ausschl. prozedural) einen Fehler-Code als Ausgabe der Funktion im Fehlerfall - also entweder gibt sie den betr. html-Code zurück oder z.B. "#Fehler99" oder "#Fehler:keinText". Somit ergäben sich für den von dir geschilderten Fall zwei Alternativen:
              • Die Funktionen stehen in dem Teil über "<!DOCTYPE HTML>" und übergeben ihre Rückgabewerte an Variablen, z.B. $StrArtPl_2 usw. Dort würde dann auch die Fehlerbehandlung erfolgen, z.B.
                PHP-Code:
                if ($StrArtPl_2 == "#Fehler99") {
                       
                $IntAllgFehler 1;
                     } else {
                       
                $IntAllgFehler 0;
                       
                $StrArtPl_2 '';
                     } 
                Die Fehlerwerte von $IntAllgFehler würden dann dort entweder zur Kenntnis genommen (um in ein Error-Log einzufließen o. dergl.) oder aber einfach aufaddiert. In dieser Variante würden sie nur zur Kenntnis genommen und die Variablen unter aufgegriffen:
                PHP-Code:
                      <div class="c_artikel">
                    <?php
                           
                echo $StrArtPl_2;
                    
                ?>
                         </div> <!-- ende .c_artikel -->
                         <div class="c_tabelle">
                    <?php
                           
                echo $StrArtPl_3;
                    
                ?>
                         </div> <!-- ende .c_Tabelle -->
                Dadurch, daß die fehlgeschlagenen Absätze durch die obige Fehlerbehandlung keinen Text enthalten -
                PHP-Code:
                 $StrArtPl_2 ''
                - entsteht dort kein Problem, die Texte fehlen einfach, evtl. gibt es eine Leerzeile (??), die niemandem auffällt.
              • Im zweiten Szenario - und den verstehe ich als Realisation deines Ansatzes insgesamt, würde die Summe der Fehlerwerte nur auf " <> 0" geprüft und wenn das der Fall ist, die Fehlerseite ausgegeben.
              Versteh ich das so jetzt erstmal richtig?

              Kommentar


              • #8
                Alf2016 ev. ist ja der Beitrag aus der Wissenssammlung auch hilfreich: https://php-de.github.io/jumpto/eva-prinzip/
                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


                • #9
                  Das ist halt sehr unübersichtlicher Code und man muss immer die möglichen Fehler einer Funktion im Kopf haben. Davon abgesehen programmiert man um PHP herum und verwendet es nicht richtig. Für die Fehlerbehandlung gibt es schon fix fertige Konzepte, und das muss nicht mit eigenen kryptischen Strings neu erfunden werden.

                  http://php.net/manual/de/book.errorfunc.php
                  http://php.net/manual/de/language.exceptions.php

                  Kommentar


                  • #10
                    Zitat von Alf2016 Beitrag anzeigen
                    Versteh ich das so jetzt erstmal richtig?
                    Yes, den Kern hättest du damit erfasst, Variablen und deren Daten werden aufbereitet bevor es an die Ausgabe geht.
                    Ob und wie die Fehler behandelt werden - joa.. ist nochmal ein anderes Thema.
                    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                    Kommentar


                    • #11
                      Zitat von hellbringer Beitrag anzeigen
                      Das ist halt sehr unübersichtlicher Code und man muss immer die möglichen Fehler einer Funktion im Kopf haben.
                      Fehler wie Datenbankabsturz etc. lassen sich alle bereits in der Funktion selbst abfangen. Von daher kann es eigentlich immer nur 3 Fehler in dem von mir geschilderten Zusammenhang geben:
                      1. Der SQL-String ist "fehlerhaft", was bei sorgf. Programmierung (die ich voraussetze) nur bedeuten kann, daß jemand ohne Wissen des Programmierers z.B. Tabellen- oder Spaltennamen geändert hat. Dann liefert
                        PHP-Code:
                        $result mysqli_query($dbcon$StrSQL); 
                        den Wert "FALSE" und das kann man abfangen.
                      2. Die Datenbank ist abgestürzt: Auch den Fehler kann man abfangen, sorgfältige Programmierer tun das.
                      3. Es gibt keinen Text, der angezeigt werden könnte: vgl. oben.
                      Davon abgesehen programmiert man um PHP herum und verwendet es nicht richtig.
                      Was ist da jetzt konkret mit "um PHP herum" und "nicht richtig" gemeint?
                      Für die Fehlerbehandlung gibt es schon fix fertige Konzepte, und das muss nicht mit eigenen kryptischen Strings
                      Was konkret ist an den gezeigten Strings (?) kryptisch?

                      Kommentar


                      • #12
                        Zitat von Alf2016 Beitrag anzeigen
                        Was ist da jetzt konkret mit "um PHP herum" und "nicht richtig" gemeint?
                        Du verwendest nicht die Fehlerbehandlungsmethoden von PHP, sondern bastelst eigene.

                        Zitat von Alf2016 Beitrag anzeigen
                        Was konkret ist an den gezeigten Strings (?) kryptisch?
                        Es ist hier nicht ersichtlich, was "#Fehler99" bedeutet. Sowas ist kryptisch.

                        Davon abgesehen sind nummerierte Variablen auch kryptisch.

                        In einem Programmcode sollten keine Zahlen vorkommen, die eine "geheime" Bedeutung haben. Sobald man Zahlen irgendwo beschreiben muss um sie zu verstehen, läuft etwas schief.

                        Kommentar


                        • #13
                          Zitat von VPh Beitrag anzeigen
                          Yes, den Kern hättest du damit erfasst, Variablen und deren Daten werden aufbereitet bevor es an die Ausgabe geht.
                          Ob und wie die Fehler behandelt werden - joa.. ist nochmal ein anderes Thema.
                          Aber ist das nicht letztlich eine rein akademische Frage? Ob die gesamte Behandlungs-Routine, die der Rückgabe der html-Strings bzw. Fehler-Codes "oben", also vor "<!DOCTYPE HTML>" oder "unten", also in der Box "content" steht, ist doch Jacke wie Hose. Im Fehlerfall erscheint dort - in Abhängigkeit von der Behandlungs-Routine - z.B. ein Text wie "Wir bitten um Entschuldigung: Aufgrund eines vorübergehenden Datenbankfehlers können im Moment keine Artikel angezeigt werden." oder die Artikel, wobei einzelne Fehlen können. Für den Fall, daß alle Artikel leer sind, kann die vorab abgefragt werden, ob alle Artikel-Text-Variablen verkettet den Wert
                          PHP-Code:
                          $StrTextSum '' 
                          haben. Fertig. Oder mache ich da jetzt einen Denkfehler?

                          Kommentar


                          • #14
                            Zitat von Alf2016
                            Ob die gesamte Behandlungs-Routine, die der Rückgabe der html-Strings bzw. Fehler-Codes "oben", also vor "<!DOCTYPE HTML>" oder "unten", also in der Box "content" steht, ist doch Jacke wie Hose.
                            Nein, nach dem Doctype wurde bereits eine Ausgabe generiert, das A vom EVA-Prinzip. Die Verarbeitung sollte komplett vorher passieren.
                            Competence-Center -> Enjoy the Informatrix
                            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                            Kommentar


                            • #15
                              Zitat von Alf2016 Beitrag anzeigen
                              Aber ist das nicht letztlich eine rein akademische Frage? Ob die gesamte Behandlungs-Routine, die der Rückgabe der html-Strings bzw. Fehler-Codes "oben", also vor "<!DOCTYPE HTML>" oder "unten", also in der Box "content" steht, ist doch Jacke wie Hose.
                              Nein, ist es nicht. Du legst dich damit fix auf eine HTML-Ausgabe fest und alles, was danach passiert, kann dies nicht mehr ändern. Auch kannst du in einem Fehlerfall keinen anderen HTTP-Statuscode mehr senden, da zuvor schon der HTTP-Status 200 (= alles is OK, keine Fehler) gesendet wurde.

                              Zum Beispiel wenn ein Datensatz in einer Datenbank nicht gefunden wuide, sollte der HTTP-Status 404 gesendet werden. Dies ist bei deinem Code aber nicht möglich.

                              Kommentar

                              Lädt...
                              X