Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie findet ihr mein Gästebuch?

Einklappen

Neue Werbung 2019

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

  • Wie findet ihr mein Gästebuch?

    Hallo ich habe vor kurzem PHP gelernt und einfach mal zur Übung ein Gästebuch geschrieben.

    Wär schön, wenn ihr euch das mal anguckt und mir sagt, wie ihr es findet und ob es Fehlerfrei ist.

    PHP-Code:
    $mail $_POST["mail"];             //Abfragen der email-Adresse
    $hp $_POST["hp"];                 //Abfragen der Homepage 
    $eint $_POST["eintrag"];         //Abfragen des Eintrages
    $datum date("d|m|Y|H|i");        //Abfragen des Datums
    $zeitjetzt explode("|",$datum);//Zerlegen des Datums zum Vergleich mit auf Datenbang gespeicherten Daten 
    $ip "$REMOTE_ADDR";                //Abfragen der ip-Adresse zum Vergleich mit auf Datenbang gespeicherten ip-Adressen

    $connect mysql_connect("localhost","username","pass") or die ("fehler beim verbinden"); //Verbindung mit mysql-Server herstellen
    mysql_select_db("73621") or die ("datenbank nicht gefunden"); //Auswählen einer mysql-Datenbank

    $i//setzen der Variable i, später wichtig für Spamschutz

    $err1//
    $err2//Setzen der error-Variablen.
    $err3//Werden für Farbliche Hervorhebung von Textfeldern,
    $err4//um Spam zu verhindern und um zu überprüfen ob alle Pflichtfelder ausgefüllt wurden benötigt.
    $err5//

    $err1Info//
    $err2Info//Setzen der error-info-Variablen um den User zu informieren, was er falsch gemacht hat
    $err3Info//und um diese Information auszugeben.
    $err4Info//
    $err5Info//


    if($name==""){                                                                                                        //
      
    $err1 "border:2px solid red;";                                                                            //
      
    $err1Info "Das Feld \"Name\" ist ein Pflichtfeld! Bitte füllen sie es aus.";        //
    }                                                                                                                        //Überprüfen ob alle Pflichtfelder aus-
    if($mail==""){                                                                                                        //gefüllt wurden und abändern der error-
      
    $err2 "border:2px solid red;";                                                                            //und error-info-variablen.
      
    $err2Info "Das Feld \"eMail\" ist ein Pflichtfeld! Bitte füllen sie es aus.";        //
    }                                                                                                                        //
    if($eint==""){                                                                                                        //
      
    $err4 "border:2px solid red;";                                                                            //
      
    $err4Info "Das Feld \"Eintrag\" ist ein Pflichtfeld! Bitte füllen sie es aus.";    //
    }                                                                                                                        //

    $sabfrage "SELECT name,ip,datum FROM guestbook";     //
    $ipdatumAbfragen mysql_query($sabfrage);                //abfrage von namen, ip und datum aus der Tabelle guestbook, gleichzeitige
    while($row mysql_fetch_object($ipdatumAbfragen)){    //einleitung des Spamschutzes
        
    if($row->ip == $ip){    //Wenn die ip des Users gleich der gespeicherten ip einer Spalte aus der Tabelle guestbook ist:
            
    $i++;            //wird i um 1 erhöht 
            
    $zeitdbvar $row->datum//und das Datum aus der selben Splte wird in der Variable zeitdbvar gespeichert
            
    $zeitdb explode("|",$zeitdbvar); //um dann als array in der Variable zeitdb gespeichert zu werden. 
            
    if($zeitdb[0] == $zeitjetzt[0] && $zeitdb[1] == $zeitjetzt[1] && $zeitdb[2] == $zeitjetzt[2] && $zeitdb[3] == $zeitjetzt[3]){ //Nun wird überprüft, ob das zerlegte heutige Datum in der Variable zeitjetzt dem in der Spalte gespeicherten Zeit entspricht. Dies wird auf die Stunde genau gemacht.
                
    $zeitdbplus5 $zeitdb[4] + 5//Dann wird die Minutenangabe der zerlegten Zeit aus der Datenbank mit 5 addiert und in der Variable zeitplus5 gespeichert. 
                
    if($zeitjetzt[4] < $zeitdbplus5 or $i == 5){ //Nun wird überprüft, ob die jetzige Minutenangabe um array zeitjetzt kleiner als die um 5 erhöhte Minutenangabe aus der Datenbank im array zeitplus5 ist.
                    
    $err5 "1"//wenn das der Fall ist wird die error-variable auf 1 , damit sie nicht "" ist
                    
    $err5Info "Sie d&uuml;rfen nur einen Eintrag in f&uuml;nf Minuten und f&uuml;nf Eintr&auml;ge am Tag machen."//und die info zu dieser error-Variable gesetzt
                
    }
            }
        }
    }

      echo 
    "<form action=\"index.php?id=guestbooksende\" method=\"post\" name=\"gb\">
      <table>
        <tr>
          <td>Name:</td><td><input type=\"text\" name=\"name\" value=\"
    $name\" style=\"$err1\"></td>
        </tr>
        <tr>
          <td>email:</td><td><input type=\"text\" name=\"mail\" value=\"
    $mail\" style=\"$err2\"></td>
        </tr>
        <tr>
          <td>Homepage:</td><td><input type=\"text\" name=\"hp\" value=\"
    $hp\" style=\"$err3\"></td>
        </tr>
        <tr>
          <td>Eintrag:</td><td><textarea name=\"eintrag\" style=\"
    $err4\" cols=\"20\" rows=\"3\">$eint</textarea>
        </tr>
        <tr>
          <td><input type=\"submit\" value=\"absenden\"></td>
        </tr>
        <tr>
          <td colspan=\"2\">
            <b>
            <font color=\"red\">"
    //dann wird das Gästebuchformular erneut ausgegeben, aber diesmal werden die Pflichfelder, die nicht ausgefüllt wurden rot markiert
        
        
    if($err1 != ""){                    //
          
    echo $err1Info."<br>";        //
        
    }                                        //
        
    if($err2 != ""){                    //
          
    echo $err2Info."<br>";        //
        
    }                                        //und die entsprechenden error-Informationen in roter Schrift
        
    if($err3 != ""){                    //ausgegeben.
          
    echo $err3Info."<br>";        //
        
    }                                        //
        
    if($err4 != ""){                    //
          
    echo $err4Info."<br>";        //
        
    }                                        //
        
    if($err5 != ""){                    //
            
    echo $err5Info."<br>";        //
        
    }                                        //
        
        
    if($err1=="" && $err2=="" && $err3=="" && $err4=="" && $err5=="") {  //Jetzt wird überprüft, ob alle error-Variablen leer sind und, wenn das der Fall ist,
          
    $eintrag="INSERT INTO guestbook (name,email,homepage,nachricht,ip,datum) VALUES ('$name','$mail','$hp','$eint','$ip','$datum')";//in die Datenbang als neue Spalte eingetragen.
          
    $writemysql_query($eintrag);
          echo 
    "Eintrag geschrieben!"//zum Schluss wir dem user gesagt, das sein Eintrag geschrieben wurde.
        
    }
         
    //dann werden noch die schließenden HTML-Tags ausgegeben. 
      
    echo" </font>
            </b>
          </td>
        </tr>
      </table>
    </form><hr>"
    ;


    $abfrage "SELECT * FROM guestbook ORDER BY id DESC";  //Am Ende werden alle Spalten aus der mysql-Datenbank abgefragt und in einer
    $abfragen mysql_query($abfrage);                             //Tabelle ausgeben.
    echo "<table cellpadding=\"0\" cellspacing=\"0\">";
    while(
    $row mysql_fetch_object($abfragen)){
        
    $zeitdbvar $row->datum;
        
    $zeitdb explode("|",$zeitdbvar);
        echo 
    "
                    <tr>
                        <td align=\"left\" style=\"background:#80C9FF;width:160px;height:20px\">
    $row->name</td>
                        <td align=\"right\" style=\"background:#80C9FF;width:430px;height:20px\">
    $zeitdb[0].$zeitdb[1].$zeitdb[2] - $zeitdb[3]:$zeitdb[4]</td>                
                    </tr>
                    <tr>
                        <td style=\"background:gray;width:160px;font-size:11px;\">eMail:<br>
    $row->email<p>Homepage:<br>$row->homepage</td>
                        <td style=\"padding:5px;\" align=\"left\" valign=\"top\">
    $row->nachricht</td>
                    </tr>"

    }
    echo 
    "</table>";
    ?> 
    sry, dass es so unstrukturiert aussieht ich hoffe ihr werdet euch trotzdem die Mühe machen es zu lesen.

  • #2
    Gut finde ich, dass du den Code sehr intensiv dokumentierst.

    Aber...

    Die mit POST übergebenen Daten übernimmst du ungeprüft in deine Anwendung und deine Datenbank.

    Die vielen Fehlerfelder und Fehlermerker sind überflüssig. Am Anfang ein $fehler = '' und bei festgestellten Fehlern ein $fehler.='Neuer Text...<br>' , danach reicht if(!$fehler) tuwas()

    Du scannst immer die komplete Tabelle nach der IP, liest also auch solche Zeilen ein, die eine andere IP haben. In der SELECT-Anweisung ein WHERE ip = '$ip' verhindert das. Du sperrst so übrigens auch Leute aus dem gleichen Netzwerk aus, z.B. 2 Leute im gleichen WLAN usw.

    Den HTML-Code kann man auch ohne Echo ausgeben. Dort, wo PHP-Ergebnisse noch einzufügen sind machst du das dann mit <?php echo $var;?>

    Datum/Zeit speichert man in der DB mit den passenden Funktionen ab. Definier mal das Feld mit datetime und mach beim INSERT dann ein now() . Die einzelnen Bestandteile von Datum und Zeit kriegst du dann über SQL-Anweisungen sehr einfach und ohne rumprogrammieren.
    [PHP]if ($var != 0) {
    $var = 0;
    }[/PHP]

    Kommentar


    • #3
      Trotz aller Anfängerfehler, die wir alle mal gemacht haben, ist es löblich etwas selbst zu programmieren.

      Ein paar Tipps:
      - Alle Variablen, die vom Benutzer kommen ($_POST, $_GET, ...) und in einer Datenbank gespeichert werden sollen müssen gesäubert werden. Für Strings mysql_real_escape_string() für Zahlen intval(). Google mal nach "SQL-Injection" - das kann passieren, wenn das Säubern vergisst.
      - Gruppiere Code, der zusammen gehört. Als z.B. alles zum Thema "Speichern des neuen Eintrags" an einer Stellen. Kein Formular-Output dazwischen.

      Was mir am Anfang geholfen hat: [url=http://tut.php-quake.net/]#php/QuakeNet Tutorial - Einf

      Kommentar


      • #4
        OK und n dickes fettes DANKE das ihr euch die Arbeit gemacht habt den Code zu lesen. Ich werd ihn wenn ich Zeit hab mal verbessern.

        Kommentar

        Lädt...
        X