# Problem mit Tut: [PHP] Komplettes Guestbook mit MySQL



## stitch (11. Dezember 2001)

Ich wollte mir jetzt mal nach dem ich nur ein paar simple Sachen in PHP gemacht hab was richtiges basteln und hab mir mal dieses Tut im anderem Forum angeschaut: http://www.tutorials.de/forum/showthread.php?s=&threadid=8664

Erstmal hab ich mit PHPmyAdmin eine Datenbank mit dem Namen "guestbook" erstellt. Dort habe ich dann einfach mal diesen Block SQL Befehle eingefügt und er hat auch meiner Meinung nach alle Felder richtig erstellt. Dann hab ich den ganzen Quellcode in ne PHP Seite eingefügt und nur die Werte für den Zugang zur DB (SQL-Server, Benutzer, Passwort) und unten den Datenbank Namen abgeändert. Das ganze wollte ich dann mal zum testen starten und er bringt mir einen Parse Error. In der Zeile steht:

```
{
```

Was ist das überhaupt und warum spuckt er nen Error? Nach meinem Verständis ist das nur ein &, der Rest wird ja wegkommentiert.

Weiss jemand rat?

thx, im vorraus


----------



## stephan01 (11. Dezember 2001)

*hoff, dass erster bin*

du musst

```
{
```
mit 

```
{
```
austauschen, glaube ich


----------



## stitch (11. Dezember 2001)

Danke, jetzt spuckt er schon mal keinen Fehler mehr! 
Hat das einen tieferen Sinn oder warum schreibt er nicht gleich die richtigen Klammern in den Code?

Funktionieren tut das GB aber leider immer noch nicht. Wenn ich jetzt was in das Formular ein tippe wird kein Beitrag eingetragen. Liegt das an meinem WAMP System oder ist ein Fehler im Script? Weiss jemand rat? Muss jetzt erstmal ins Training, werde später warscheinlich mal auf nen Server im Netz laden.


----------



## stephan01 (11. Dezember 2001)

hab's auch nicht zum laufen bekommen....hatte nur halt beim probieren annähernd das gleiche prob 

tschau viel spaß beim training


----------



## Christian Fein (12. Dezember 2001)

Konkretiesier mal bitte :

schreibt er nur den "Beitrag" nicht rein oder komplett keinen Eintrag ?


----------



## stitch (12. Dezember 2001)

Meinst du ob der Beitrag nur nicht in die Seite eingefügt wird oder ob er überhaupt nicht in die DB geschrieben wird?

Weiss nicht genau, wie ich das überprüf. Ist das erste mal, dass ich was mit ner Datenbankanbindung probiere. Im phpMyAdmin steht bei der Tabelle gestbook - Daten: 0 Bytes 
Ich denke mal das ist ein Hinweis, dass er den Inhalt der Form überhaupt nicht in die Datenbank schreibt, oder? Wie kann man den genauen Inhalt der Felder in einer Tabelle einsehen? Geht das auch mit dem phpMyAdmin?


----------



## NocTurN (12. Dezember 2001)

Hi,
also das mit dem 
	
	
	



```
{
```
 ist ein fehler im forum script soweit ich das sehe, da bei mir die ganz normalen klammern an eben dieses stellen vorhanden sind, und ich es auch mit diesen gepostet habe.

Also musst du alle diese teile mit einer { austauschen. Dann sollte es funzen, wenn du aber weiterhin probleme hast, gib mir bescheid damit ich das Tutorial nochmal überarbeiten kann.

greetz


----------



## Maniac (14. März 2008)

stitch hat gesagt.:


> Danke, jetzt spuckt er schon mal keinen Fehler mehr!
> Hat das einen tieferen Sinn oder warum schreibt er nicht gleich die richtigen Klammern in den Code?
> 
> Funktionieren tut das GB aber leider immer noch nicht. Wenn ich jetzt was in das Formular ein tippe wird kein Beitrag eingetragen. Liegt das an meinem WAMP System oder ist ein Fehler im Script? Weiss jemand rat? Muss jetzt erstmal ins Training, werde später warscheinlich mal auf nen Server im Netz laden.



das GB funktioniert schon, allerdings nur wenn in der "php.ini" "register_globals" auf ON steht.

da dieses aber ein sicherheitsrisiko ist sollten $_POST['variablen'] verwendet werden.


```
$name = $_POST['name'];
$text = $_POST['text'];
```

oder direkt mit dem POST-Variablen arbeiten:



```
<?php  
// Zunächst brauchen wir eine Datenbankverbindung: 
$verbindung = mysql_pconnect( "dein.mysql.server", "deinSQLbenutzername", "deinSQLpasswort"); 

if (!$verbindung) // War die verbindung NICHT erfolgreich? -> Wenn ja: Fehler auswerfen und beenden 
{ 
    echo "<br><center><b>- Keine Verbindung zur Datenbank -</b></center>"; 
    exit; 
} 

mysql_select_db("deinedatenbank"); //Datenbank auswählen in die geschrieben werden soll 

if($_POST['neueintrag']) //ueberprueft ob der submit button gedrückt wurde 
{ //Wenn ja dann daten in den guestbook table eintragen 

    $id = time(); //time() gibt die zeit seit dem beginn des Unix Zeitalters in sekunden zurück 
                  //wir benutzen id als Datums und Identifikations-Angabe, doch mehr dazu später 

         
    $sqlkommando = "INSERT INTO guestbook (id, name, email, homepage, message) VALUES ('$id', '".mysql_real_escape_string($_POST['name'])."', '".mysql_real_escape_string($_POST['email'])."', '".mysql_real_escape_string($_POST['homepage'])."', '".mysql_real_escape_string($_POST['message'])."')"; 
    // Auf gut deutsch: Füge in guestbook bei "id, name, email, homepage, message" die werte der variablen "$id, $name, $email, $homepage, $message" ein 

    mysql_query($sqlkommando) or die("Error: " . mysql_error()); // Kommando 'sqlkommando' ausfuehren 
                                                                 // bei misserfolg beenden und fehlermeldung ausgeben 
     
    echo "Eintragung erfolgreich hinzugefügt"; // Bestätigung ausgeben 
} 

?>
```

die function

```
mysql_real_escape_string()
```
zerpflückt auf gut deutsch den eingegebenen text auf sonderzeichen und wandelt es um. mit 

```
stripslashes()
```
wird es wieder zusammengesetzt wie im unteren teil des tutorials ja gezeigt.


----------



## räkor (7. September 2008)

Hi Maniac_81,
aufgrund Deines Tips läuft bei mir das TuT-Gästebuch jetzt. Das einzige, was nicht funktioniert ist dei Ausgabe des Datums. Da gibt er:

geschrieben:-//:

aus. Also nur die Datum- und Zeit-Trennzeichen. Kann es sein, das das auch mit dem $_POST['variablen'] zusammenhängt?


----------



## monicas (8. Oktober 2008)

Hallo,
ich stricke auch soeben an diesem guestbook. bei mir funktioniert bis jetzt auch alles, bis auf das datum.
Zuerst wurde die ID 0 in der mysql tabelle gespeichert, sodann habe ich auf auto_increment gestellt, jetzt bekomme ich zwar eine ID, galube aber nicht das das so richtig ist, den nun gibt er fuer jeden eintrag das gleiche datum.
Jemand eine Idee?


----------



## Maniac (8. Oktober 2008)

so, ich hab mir das scriptlein nochmal genauer angesehen. Is ja doch schon eine Weile her. 

Stell das Datenbankfeld  "id" auf Primärschlüssel, dann sollte es Funktionieren. "auto_increment" ist in diesem Fall nicht das richtige, da es ja sonst immer um einen Zähler erhöht.


----------



## monicas (8. Oktober 2008)

Hi Maniac,
vielen Dank fuer deine Hilfe!
Ich habe der ID den Primarykey gegeben, aber leider funktioniert es noch nicht. In der Datenbank erscheint die ID 0, und auf der Gaestebuchseite nach eingabe der Werte fuer Namen und Test kommt: Error: Duplicate entry '0' for key 1

Was kann das sein? Er bekommt die ID nicht in die Tabelle.


----------



## Maniac (8. Oktober 2008)

Habe es eben mal getesten. Ist ja klar, der erste Eintrag wird gemacht, jedoch da kein Feld als "auto_increment" gesetzt ist, wird auch keine neue Zeile angefangen. ich würde das Feld "id" als "auto_increment" setzen und für das Datum ein Extra Feld machen.


----------



## monicas (8. Oktober 2008)

Jau genau, er versucht quasi immer in den Tabelleneintrag 0 reinzuschreiben, das funktioniert natuerlich nicht. Wenn ich Auto_incremetn setzte, funktioneirt das Gaestebuch wieder gibt allerdings das Datum Thuirsday - 1/1/2009 1:0 an.

Eigentlich sollte ich ja nicht auto_increment setzen, da ja das Datum (also die $ID = time(); )  die Sortierreihenfolge in der Ausgabe bestimmt. Die Serverabfrage mit time() soll ja die ID bestimmen.

Gruebbel


----------



## Maniac (8. Oktober 2008)

Deswegen schrieb ich das Du fürs Datum ein Extra Feld angeben sollst. Su kannst die die Datenbank-Abfrage trotzdem per Time ausgeben. 


```
$sqlkommando = "SELECT * FROM guestbook ORDER BY datum DESC";
```

Wobei es eigentlich egal ist ob du nun nach der eintrags-ID oder dem Datum ausgibst. Eigentlich ist es so üblich das man Einträge anhand seiner Eindeutigen ID, dem auto_increment Wert ansppricht.

Davon mal abgessehen solltest Du vielleicht ein neueres Tutorial nehmen, dieses ist doch schon etwas älter und entspricht nicht mehr ganz den Standarts.


----------



## monicas (8. Oktober 2008)

Da hast Du in jedem Fall recht, und so werd ichs auch machen, falls ich nicht dahinter komme, warum der 


```
$id = time ();
```

keinen (bzw 0) Eintrag in der Tabelle liefert. Sozusagen eine persoenliche Herausforderung...


----------



## monicas (8. Oktober 2008)

Guten Abend,

habe soeben versucht, ob die Abfrage


```
<?php
$t=time();
echo($t . "<br />");
echo(date("D F d Y",$t));
?>
```

auf meinem server läuft, und ja, es geht. Umsomehr wundere ich mich das die


```
$id = time();
$sqlkommando = "INSERT INTO guestbook (id, name, email, message) VALUES ('".mysql_real_escape_string($_POST['id'])."', '".mysql_real_escape_string($_POST['name'])."', '".mysql_real_escape_string($_POST['email'])."', '".mysql_real_escape_string($_POST['message'])."')";
```

die id nicht in die Datenbank-tabelle einfügt. Hat dazu jemand eine Idee?


Ps. In mysgl ist die id-spalte so definiert:
id 	bigint(20) 	       (Null)Nein 	auto_increment


----------



## Maniac (9. Oktober 2008)

Da Dein Feld "id" auto_increment" ist, kann es auch den Wert da nicht reinschreiben. Ein Feld des Types "auto_increment" muss eine Extra Spalte haben, habe es Dir doch weiter oben bei den Beiträgen erklärt.


----------

