• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

PHP - Probleme by MySQL basiertem Guestbook-Skript

Talwyn

New member
Also, es geht um folgendes Problem. Ich bin im Moment dabei ein MySQL-basiertes Guestbook zu schreiben, und das Ding will einfach nicht so, wie ich will :(

Zum Aufbau:

- In einem HTML-Formular werden der Name des Autors und der und dessen Kommentar an ein PHP Skript übergeben.
- Das Skript erstellt nun im Unterverzeichnis /gbfiles eine Datei, die den Kommentar enthält (z.B. 0001.gbf).
- Der Dateiname wird dabei aus der MySQL Datenbank (aus dem Primary Key) generiert.
- In der Datenbank wird nun nur der Name des Autors und die Pfadangabe für die Kommentar-Datei gespeichert.
- Schließlich gibt das Skript eine Tabelle aus, in der aus der Datenbank der Autorenname und aus der Kommentardatei der Kommentar eingepflegt werden.

Zu den Problemen:
- Die Kommentar-Dateien (.gbf) werden nicht im Unterverzeichnis /gbfiles sondern im Stammverzeichnis des Skripts erstellt.
- Wenn man einen Kommentar eingibt und auf "Senden" klickt, ändert sich erstmal gar nichts. Erst wenn man nochmal F5 drückt oder versucht einen neuen Eintrag zu erstellen, erscheint der alte Kommentar.

Quelltext:

<form action="<?php echo $PHP_SELF ?>" method="post">
<table align="center">
<tr>
<h1>Guestbook</h1>
</tr>
<tr>
<font face="Verdana, arial, helvetica, sans-serif" size="-1">Ihr Name:</font>
</tr>
<tr>
<input type="text" name="name" size="52" style="border-style:solid;border-color:black;border-width:1px;background-color:#eeeeee">
</tr>
<tr>
<font face="Verdana, arial, helvetica, sans-serif" size="-1">Ihr Kommentar:</font>
</tr>
<tr>
<textarea rows="10" cols="40" name="kommentar" style="border-style:solid;border-color:black;border-width:1px;background-color:#eeeeee"></textarea
</tr>
<tr>
<div align="right">
<input type="submit" value="Absenden">
</div>
</tr>
</table>
</form>

<!-- Beginn PHP-Code! -->



<?php
$db = @mysql_connect("localhost", "Administrator", "cadd66");
mysql_select_db("rokugate", $db);
$nor = mysql_query("SELECT * FROM guestbook;");
$anzahl = mysql_num_rows($nor);
if(!empty($kommentar)) {
$filepath = "gbfiles/"+($anzahl+1)+".gbf";
$filehandle = fopen($filepath, "w");
fwrite($filehandle, $kommentar);
fclose($filehandle);
mysql_query("INSERT INTO guestbook (author, compath) VALUES ('$name', '$filepath');");
}
echo "<table width=90%>";
while ( $row = mysql_fetch_row($nor)) {
echo "
<tr>
<p><b>$row[1]</b></p>
</tr>
<tr>
<p>";
readfile($row[2]);
echo "</p>
</tr><hr>";
}
@mysql_close($db);
echo "</table>";
echo "$filepath";
?>



<!-- Ende PHP-Code! -->

P.S.: Ich fürchte ich habe mich irgendwo mit den Verzeichnisangaben verzettelt. Der Bug mit dem Aktualisieren ist mir allerdings ein echtes Rätsel.

Danke schonmal, Talwyn
 
Wenn du die Datenbank sowieso schon bemühst, könnte du doch auch gleich den Rest da rein packen :rolleyes:.... nur mal so als Meinung auf die schnelle ;)
 
Einmal DB Connect und danach files öffnen, das bedeutet in meinen Augen doppelte Last, das eine oder das andere ist irgendwie sinniger und via DB hast du sehr wahrscheinlich einen schnelleren Erfolg ;).

Gut geplant ist halb "gescripted" ;)
 
Ok habe jetzt auch die Kommentare direkt in die DB übernommen. Der aktuelle Code sieht so aus:

<?php
$db = @mysql_connect("localhost", "Administrator", "cadd66");
mysql_select_db("rokugate", $db);
$nor = mysql_query("SELECT * FROM guestbook");
$anzahl = mysql_num_rows($nor);
if(!empty($kommentar)) {
mysql_query("INSERT INTO guestbook (author, comment) VALUES ('$name', '$kommentar');");
}
@mysql_close($db);
echo "<table width=90%>";
while ( $row = mysql_fetch_row($nor) ) {
echo "
<tr>
<p><b>$row[1]</b></p>
</tr>
<tr>
<p>$row[2]</p>
</tr>
<hr>";
}
echo "</table>";
?>

Der einzige Bug der noch besteht ist das Problem mit dem Aktualisieren...
 
Nimm ein zusätzliches Feld in deine DB names id und lass einen sog. auto increment Wert dort eintragen, das macht mysql ganz automatisch. Anhand dieser id, die du wieder mitauslesen musst, kannst du ein eindeutiges UPDATE Statement erstellen undeinzelnen Beiträge editieren!
 
also daß Dein Guestbook nach dem Senden erstmal nix anzeigt ist ein "Feature-by-Design" (wie Microsoft sich ausdrücken zu beliebt ;) ).... und zwar machst Du zuerst einen Select Query und danach erst Deinen Insert....
Auch wenn Du die Zeilen erst später abholst, so wird das Recordset doch beim Select gebildet. Somit stehen die Daten zum Zeitpunkt des Selects schon fest und Du siehst den neuen Datensatz erst beim nächsten Select (Refresh).

Drehe die Reihenfolge um und das Ganze läuft rund....

den Tipp von style-guide! würde ich mir mal überlegen, ein eindeutiger Schlüssel bringt in Deinem Fall vermutlich nicht viel, aber er erleichtert spätere Erweiterungen.
Und wo wir schon beim DB Entwurf sind, so wäre ein Eintragsdatum vermutlich auch keine schlechte Idee... vorher mit den Dateien hätte notfalls das Filedatum herhalten können, aber jetzt gibts das nicht mehr (was auch besser / sauberer ist). Das Datum kann dann auch zur Sortierung hergenommen werden, dann es ist nicht gesagt, daß ein select * from gb die Daten in der Reihenfolge ihres Erstellens zurückgeliefert werden. Spätestens, wenn Du die ersten Einträge löscht und der freie Platz von mysql wieder verwendet wird, wirst Du sehen, daß alles durcheinander ist....
 
Also, die Tabelle sieht jetzt wie folgt aus:

CREATE TABLE guestbook
(id INT(5) DEFAULT '0' NOT NULL AUTO_INCREMENT PRIMARY KEY,
autor VARCHAR(50),
datum DATE,
email VARCHAR(80),
website VARCHAR(80),
kommentar BLOB)
;

Die Sache mit der Reihenfolge habe ich gestern auch entdeckt, eigentlich halbwegs logisch. Soweit funktioniert jetzt alles. Nur das Problem mit dem Aktualisieren besteht dank method=post Formular immer noch. Muss ich wohl noch ne kleine Abfrage einbauen, um zu verhindern, dass Daten doppelt in der Tabelle gespeichert werden.
 
Zurück
Oben