kostenloser Webspace werbefrei: lima-city


Gästebuch

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    php-test1

    Kostenloser Webspace von php-test1

    php-test1 hat kostenlosen Webspace.

    Hallo,

    ich habe ein kleines Problem mit meinem neuen Gästebuch. Ich habe mir ein neues Gästebuch mit PHP Programmiert. Die Einträge werden auch wie gewollt in der Datenbank gespeichert, nur wenn man dann das Gästebuch aufruft, sieht man nur einen Eintrag. In der Datenbank sind nun aber schon zwei gespeichert. Ich konnte keinen Fehler finden.

    Hier mal der Quelltext von meinem Gästebuch:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <title>Computer & fun|Gästebuch</title>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    <meta name="google-translate-customization" content="8aaa0067c6bc0777-6ae1771768e61854-g850d033d9df28719-1a">
    <link rel="stylesheet" type="Text/Css" href="/style.css">
    <link rel="shortcut icon" href="favicon1.jpg" type="image">
    </head>
    <body>
    <div id="alles">
    <div id="nav">
    
    <?php
    include("./navigation.php");
    ?>
    
    </div>
    <div id="inhalt">
    
    <h4><a href="infos_gaestebuch.php">Informationen zum Gästebuch</a> <span style="color: red;">Bitte lesen!</span></h4>
    <center>
    <h1><u>G&auml;stebuch</u></h1>
    
        <fieldset>
                <legend>Neuer Eintrag</legend>
                <a href="eintragen.php">Neuen Eintrag schreiben &raquo;</a>
        </fieldset>
        <fieldset>
                 <legend>G&auml;stebuch</legend>
        </fieldset>
    
    <?php
            $verbindung = mysql_connect("mysql.lima-city.de", "***","***")
            or die ("Fehler im System");
    
            mysql_select_db("db_261067_1")
            or die ("Konnte keie verbindung zur Datenbank herstellen...");
    
            $pagesuche = 0;
            $url = $_SERVER ["REQUEST_URI"];
            $pagesuche =  strpos($url, "?page=");
    
            if(pagesuche == "") {
                $page = 1;
            }  else {
                $page = $_GET ["page"];
            }
    
        $wo = ($page * 5) - 5;
        $wo++;
    
        $zahl = 1;
        $pos = 1;
    
        $abfrage = "SELECT id FROM gaestebuch_neu ORDER BY id DESC";
        $ergebnis = mysql_query($abfrage);
        while($row = mysql_fetch_object($ergebnis))
    
        {
            if($zahl == $wo) {
              $pos = $rof->id;
            }
            $zahl++;
        }
    
    
        $abfrage = "SELECT * FROM gaestebuch_neu WHERE id <= '$pos' ORDER BY id DESC LIMIT 5";
        $ergebnis = mysql_query($abfrage);
        while($row = mysql_fetch_object($ergebnis))
    
        {
    ?>
    <h3><?php echo $row->name; ?> <small style="color:grey;">schrieb:</small></h3>
    <p>
    <?php echo $row->nachricht; ?>
    </p>
    <h5 style="color:grey;"><?php echo $row->datum; ?></h5>
    <hr />
    <?php
        }
    
    ?>
    </fieldset>
    <fieldset>
        <legend>Navigation</legend>
        <?php
        if($page > 1) {
    
        ?>
         <a href="/gaestebuch.php?page=<?php echo ($page - 1); ?>">Zur&uuml;ck</a>
        <?php
        }
    
            $anzahlseite = ceil($zahl-1 / 5);
            $weiterfrage = $anzahlseite - page;
    
            if(weitefrage > 0) {
            ?>
            <a href="/gaestebuch.php?page=<?php echo ($page + 1); ?>">Weiter</a>
            <?php
    
            }
    
        ?>
    
    </fieldset>
    </center>
    </div>
    </div>
    </body>
    </html>


    Kann von euch da vielleicht jemand einen Fehler erkennen?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. marvinkleinmusic

    Kostenloser Webspace von marvinkleinmusic

    marvinkleinmusic hat kostenlosen Webspace.

    Ich erschließe hierraus das er immer den Eintrag mit der id 1 anzeigen soll.
    $zahl = 1;
        $pos = 1;
    
        $abfrage = "SELECT id FROM gaestebuch_neu ORDER BY id DESC";
        $ergebnis = mysql_query($abfrage);
        while($row = mysql_fetch_object($ergebnis))
    
        {
            if($zahl == $wo) {
              $pos = $rof->id;
            }
            $zahl++;
        }
    
    
        $abfrage = "SELECT * FROM gaestebuch_neu WHERE id <= '$pos' ORDER BY id DESC LIMIT 5";
        $ergebnis = mysql_query($abfrage);
        while($row = mysql_fetch_object($ergebnis))



    versuch es mal wenn du die abfrage ein wenig abänderst:
    $abfrage = "SELECT * FROM gaestebuch_neu  ORDER BY id DESC LIMIT 5";
        $ergebnis = mysql_query($abfrage);
        while($row = mysql_fetch_object($ergebnis))


    so sollte er eigendlich maximal 5 Einträge anzeigen und diese nach id Ordnen.

    LG
  4. Autor dieses Themas

    php-test1

    Kostenloser Webspace von php-test1

    php-test1 hat kostenlosen Webspace.

    marvinkleinmusic schrieb:
    Ich erschließe hierraus das er immer den Eintrag mit der id 1 anzeigen soll.
    [...]

    versuch es mal wenn du die abfrage ein wenig abänderst:
    $abfrage = "SELECT * FROM gaestebuch_neu  ORDER BY id DESC LIMIT 5";
        $ergebnis = mysql_query($abfrage);
        while($row = mysql_fetch_object($ergebnis))


    so sollte er eigendlich maximal 5 Einträge anzeigen und diese nach id Ordnen.

    LG


    Danke für deine Antwort, aber mit diesem neuen Code funktioniert es leider immernoch nicht. Es wird wie zuvor nur der erste Eintrag mit der id 1 angezeigt. Die Einträge mit der id 2, 3, 4 bleiben einfach aus.
  5. php-test1 schrieb:
    ... Ich konnte keinen Fehler finden ...

    wegen zeitmangel poste ich hier mal nur eine vermutung. in der zeile 66 in deinem code (von deiner eröffnung) steht
    $pos = $rof->id;
    aber ein objekt $rof gibt es nicht! es sollte - nach meiner vermuting - $row heißen. probiere es einfach aus.

    Beitrag zuletzt geändert: 10.7.2013 19:46:01 von czibere
  6. Hallo,

    du hast in deinem Code einige kleine Fehler gemacht. Um dir bestmöglich zu helfen will ich dir kurz deine Fehler aufzeigen und zum Schluss meinen Vorschlag für deinen Code zeigen.

    1.) Als erstes fällt auf, dass du die Logik und die Auszeichnung, sprich die Ausgabe in einer Datei machst, dadurch wird der Code sehr unübersichlich, versuche hier eine Lösung zu finden, bei der diese beiden Bereiche möglichst gut getrennt sind, wie das aussehen kann, kann man in meinem Beispiel am Ende sehen, wo die Logik in einer PHP-Datei abgehandelt wird und zum Schluss eine weitere Datei inkludiert wird, die das HTML enthält. Meine Lösung ist zwar auch nicht optimal, aber sie reicht aus, um zu verdeutlichen was ich meine.

    2.) Du machst es die unnötig schwer herauszufinden, welche Seite angezeigt werden soll, denn ob die Variable per GET übergeben wurde kannst du mit isset($_GET['variable']) herausfinden. Außerdem solltest du überprüfen, dass auch nur Ziffern in der Variable stehen, dafür bietet PHP die Funktion ctype_digit($variable) an, Insgesamt sollte dein Code also etwa so aussehen:
    $page = 1;
    if(isset($_GET['page']) && ctype_digit($_GET['page']){
        $page = $_GET['page'];
    }

    3.) Um herauszufinden, welche Einträge angezeigt werden machst du zwei sehr langsame Datenbankabfragen, diese kannst du extrem beschleunigen. Insgesamt brauchst du zwar immernoch 2 Abfragen (eine für die Navigation und eine für die angezeigten Daten), aber diese sind viel schneller! Außerdem ist es sinnvoll die Queries für die Abfragen in einem String mit Platzhaltern zu schreiben, da so Fehler schneller auffallen. Um die Platzhalter einzufügen verwende ich, bei der veralteten DB-Anbindung die du benutzt, sprintf(STRING, REPLACEMENTS...), diese Funktion ist nämlich genau dafür gedacht. Wenn du die moderne PDO-Datenbankschnittstelle verwenden würdest wäre die Möglichkeit Platzhalter zu verwenden bereits in die Schnittstelle integriert und ebenfalls etwas schneller.
    (Das Beispiel mit der Verbesserung folgt nach Abschnitt 4, da die Lösung beide Abschnitte zusammenfasst)

    4.) Du bildest Logik im PHP-Code ab die man am besten (vor allem aus Performancegründen, aber auch weil es so leichter ist) im SQL-Query behandelt. Die Berechnung, von welcher ID bis zu welcher ID die Einträge ausgegeben werden sollen ist in SQL einfach schneller, als wenn PHP aus einer riesigen Menge Daten die relevanten Einträge heraussuchen soll.
    Die Abfrage welche Einträge angezeigt werden sollen sollte also eher so aussehen:
    $query = 'SELECT * FROM gaestebuch_neu ORDER BY id DESC LIMIT %d, %d';
    $result = mysql_query(sprintf($query, $page*$entries-$entries+1, $entries);
    $output = '';
    while($row = mysql_fetch_object($result)){
        $output .= sprintf(
            "<h3>%s <small style=\"color:grey;\">schrieb:</small></h3>\n<p>%s</p>\n<h5 style=\"color:grey;\">%s</h5>\n<hr />",
            $row->name,
            $row->nachricht,
            $row->darum
        );
    }

    Wie man sieht, wird die sprintf-Funktion benutzt um die Platzhalter %d und %d zu ersetzen, diese Platzhalter werden mit den Nummern ersetzt, die angeben welche Einträge gefunden werden sollen, zum einen ist dies der erste Eintrag, der gefunden werden soll ($page*$entries-$entries+1) und zum Anderen die Anzahl der Einträge, die ausgegeben werden sollen.
    * Beispielrechnung für den ersten Eintrag, Angenommen es soll der erste Eintrag auf Seite 1 gefunden werden und 5 Einträge ausgeben werden:
    ERSTER EINTRAG = $page*$entries-$entries+1
    ERSTER EINTRAG = 1*5-5+1
    ERSTER EINTRAG = 1
    für Seite 2 sähe das dann so aus:
    ERSTER EINTRAG = $page*$entries-$entries+1
    ERSTER EINTRAG = 2*5-5+1
    ERSTER EINTRAG = 6

    5.) Die Berechnung der Navigation kann erheblich vereinfacht werden, dies sollte aber aus dem Schlussbeispiel sehr einfach ersichlich sein.

    Wie gesagt kommt zum Schluss noch eine beispielhafte Umsetzung deines Problems. Wie ebenfalls bereits besprochen ist die Logik von der Darstellung weitestgehend getrennt und läd zum Schluss einfach die Datei nach, die das HTML enthält.

    Die Logik:
    <?php
    $connection = mysql_connect("mysql.lima-city.de", "***","***") or die ("Fehler im System");
    mysql_select_db("db_261067_1") or die ("Konnte keie Verbindung zur Datenbank herstellen...");
    
    $page = 1;
    $entries = 5;
    $output = '';
    $navigation = '';
    
    if(isset($_GET['page']) && ctype_digit($_GET['page'])
        $page = $_GET['page'];
    
    $query = 'SELECT * FROM gaestebuch_neu ORDER BY id DESC LIMIT %d, %d';
    $result = mysql_query(sprintf($query, $page*$entries-$entries+1, $entries);
    while($row = mysql_fetch_object($result)){
        $output .= sprintf(
            "<h3>%s <small style=\"color:grey;\">schrieb:</small></h3>\n<p>%s</p>\n<h5 style=\"color:grey;\">%s</h5>\n<hr />",
            $row->name,
            $row->nachricht,
            $row->darum
        );
    }
    
    $query = 'SELECT count(*)/%d FROM gaestebuch_neu';
    $result = mysql_query(sprintf($query,$entries));
    $pageCount = mysql_fetch_array($result)[0];
    
    if($page > 1){
        $navigation .= sprintf('<a href="/gaestebuch.php?page=%d">Seite zurück</a>', $page-1);
    }
    if($page < $pageCount){
        $navigation .= sprintf('<a href="/gaestebuch.php?page=%d">Seite vor</a>', $page+1);
    }
    
    include_once 'gb-html.php';


    und die Darstellung (gb-html.php)
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <title>Computer &amp; fun|Gästebuch</title>
        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
        <meta name="google-translate-customization" content="8aaa0067c6bc0777-6ae1771768e61854-g850d033d9df28719-1a">
        <link rel="stylesheet" type="Text/Css" href="/style.css">
        <link rel="shortcut icon" href="favicon1.jpg" type="image">
    </head>
    <body>
    <div id="alles">
        <div id="nav">
    <?php include_once "navigation.php"; ?>
        </div>
        <div id="inhalt">
            <h4><a href="infos_gaestebuch.php">Informationen zum Gästebuch</a> <span style="color: red;">Bitte lesen!</span></h4>
            <center>
                <h1><u>Gästebuch</u></h1> 
                <fieldset>
                    <legend>Neuer Eintrag</legend>
                    <a href="eintragen.php">Neuen Eintrag schreiben »</a>
                </fieldset>
                <fieldset>
                    <legend>Gästebuch</legend>
                </fieldset> 
    <?php echo $output; ?>
                <fieldset>
                    <legend>Navigation</legend>
    <?php echo $navigation; ?>
                </fieldset>
            </center>
        </div>
    </div>
    </body>
    </html>


    Guck dir am besten an, was ich anders gemacht habe und google die Funktionen oder Befehle, die dir unverständlich sind oder frage hier nochmal nach. Wenn du die Ratschläge befolgst kannst du dein Programm bestimmt verbessern.

    Mit freundlichen Grüßen

    Beitrag zuletzt geändert: 11.7.2013 13:12:24 von nemoinho
  7. Autor dieses Themas

    php-test1

    Kostenloser Webspace von php-test1

    php-test1 hat kostenlosen Webspace.

    Ich habe den Fehler nach einiger zeit nun doch selber gefunden. Alles funktioniert jetzt so, wie ich es mir vorgestellt habe.

    Danke an alle, die mir helfen wollten.
  8. Wie wärs wenn du uns nun auch mitteilen würdest wie du es gelöst hast, bzw. was der Fehler war?
  9. Autor dieses Themas

    php-test1

    Kostenloser Webspace von php-test1

    php-test1 hat kostenlosen Webspace.

    kikiundpaddy schrieb:
    Wie wärs wenn du uns nun auch mitteilen würdest wie du es gelöst hast, bzw. was der Fehler war?


    Warum sollte ich dass denn sagen? Naja, ist auch egal.

    Mein Problem war ja, dass nur ein Eintrag angezeigt wurde. Ich wollte aber logischerweise, dass alle Einträge, die in der Datenbank gespeichert wurden angezeigt werden. Der Fehler war nun letztendlich in der Datenbankabfrage. Also hier:
    $abfrage = "SELECT * FROM gaestebuch_neu ORDER BY id DESC";


    Ich hatte eigentlich ein Limit gesetzt, dass nur 5 Einträge pro Seite angezeigt werden. Man hätte dann immer weiter blättern können. Aber dann habe ich mir gedacht, weil eh nicht so unglaublich viele Einträge geschrieben werden, dann könnte ich das auch alles weglassen, und kein Limit setzen. Dann hatte ich aber im oben genannten Code bis "id" alles weggenommen. Der Code hatte dann natürlich nicht mehr funktioniert. Weil ich mal wieder nicht richtig aufgepasst hatte. Ich war aber auch ziemlich im Stress in diesem Moment. Dann habe ich aber irgendwann mitbekommen, dass ich dieses "DESC" vergessen hatte, und schon hat wieder alles funktioniert.

    Das war der ganze Fehler. Aber bei mir ist es machnmal so, dass ich den leichtesten Fehler übersehe. :biggrin:
  10. php-test1 schrieb:
    ... Warum sollte ich dass denn sagen? ...
    wenn man hier fragen stellt (die du ja reichlich tust), und du hoffst eine antwort zu bekommen, dann hofft der fragesteller, dass es hier altruistische leute ihm zu hilfe eilen. deine einstellung ist egoistisch. nur darum. (dass man auf so etwas extra hinweisen muss ... !!??)
  11. Hallo :wave:

    czibere schrieb:
    php-test1 schrieb:
    ... Warum sollte ich dass denn sagen? ...
    wenn man hier fragen stellt (die du ja reichlich tust), und du hoffst eine antwort zu bekommen, dann hofft der fragesteller, dass es hier altruistische leute ihm zu hilfe eilen. deine einstellung ist egoistisch. nur darum. (dass man auf so etwas extra hinweisen muss ... !!??)


    Ich dachte mir genau dasselbe als ich php-test1's Post las. Manche Leute verstehen einfach nicht wie Foren funktionieren, da werden wild uralte Posts ausgegraben, irgendein Käse zusammengegoogelt und Lösungen verschwiegen (v.a. "schreibt mir ne Nachricht wenn ihr die Lösung wissen wollt" ist immer wieder amüsant). Oder Schlimmeres. :biggrin:

    Und dann beschweren sich solche Leute auch noch, wenn man ihnen das vorwirft.

    mfg :wave:
  12. finde ich auch so

    aber die erklärung von nemoinho ist echt gut >>> dankeschön ich werde die lösung mal durcharbeiten >>> da hasste dich aber echt bemüht

    Beitrag zuletzt geändert: 19.7.2013 23:21:45 von solist
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!