Fragen zu if() und Weiterem....
Hi. Wir haben jetzt in der BBS auch mal angefangen, mit PHP zu programmieren.
Dazu gab es dann auch gleich ein richtig schönes kleines Projekt, in dem wir ein Gästebuch schreiben sollten (Formular und MySQL-Datenbank).
Jetzt bin ich hier bei 2 Anforderungen aber auf Probleme gestoßen und bin nach etlichen Versuchen, diese Fehler zu beheben, mit meinem Latein am Ende...
Auf dem Formular gibt es 3 Felder : Name, URL und Textfeld...
Zunächst zu den Anforderungen, bei denen in meinem Script Probleme auftauchen :
1. Es soll verhindert werden, dass das Formular 2mal abgesendet wird und daurch die Datenbank zugemüllt wird.
Hierzu soll ein Timestamp mittels time() in eine Textdatei (ja das ist wirklich die Anforderung) geschrieben werden und dann beim nächsten Submit wieder ausgelesen werden.
Der eingelesene Wert soll dann mit der aktuellen Zeit verglichen werden.
Stimmt die Zeit überein, ist ein Reload oder ein Doppelpost gemacht worden. In diesem Fall soll nicht in die Datenbank geschrieben werden.
2. Trifft 1 nicht zu und es darf in die Datenbank geschrieben werden, so soll vorher geprüft werden, ob Name UND Textfeld ausgefüllt worden sind.
Beide Anforderungen sollen als einzelne Funktionen in einer Datei abgelegt werden, die mittels include() eingebunden wird.
Jetzt hab ich folgende Probleme :
1. Wenn ich den Timestamp in eine Datei geschrieben habe und dann auslese, kann ich beim ersten Submit nichts abschicken, da der Vergleich logischerweise fehlschlägt (TimeStamp aus der Datei = time() ). Wie kann ich das verhindern ?
Hier mal das zugehörige Form-Element und die beiden TimeStamp-Funktionen:
So weit ,so gut. Die Datei wird angelegt. Nur ich kann nicht beim ersten Formularaufruf submitten ! Das ist ärgerlich, zumal nach Druck auf Submit die Eingabefelder gelöscht werden.
Das 2te Problem tritt dann auf, wenn das Einfügen in die Datenbank zulässig wäre. Hier funktioniert die If-Bedingung anscheinend nicht, wie sie soll :
Die Parameter $name2 und $text2 sind Namensfeld und Textfeld im Formular. $text2 ist eine Textarea und $name2 ist ein Input mit Type="text".
Das Problem hier ist folgendes : Eigentlich sollte es so sein, dass nur wenn beide Felder gefüllt sind, in die Datenbank geschrieben werden darf. Wenn ich den Namen leer lasse und die Textarea fülle, dann funktioniert diese Bedingung einwandfrei und es würde nicht geschrieben werden. Aber fülle ich den Namen und lasse die Textarea leer, dann würde immer geschrieben werden. Egal, was ich probiere, sobald der Name drinsteht scheint es egal zu sein, ob noch Text im Textfeld eingetragen ist...
Woran könnte das liegen ?
Schonmal im Voraus vielen Dank für eure Hilfestellung
Hi. Wir haben jetzt in der BBS auch mal angefangen, mit PHP zu programmieren.
Dazu gab es dann auch gleich ein richtig schönes kleines Projekt, in dem wir ein Gästebuch schreiben sollten (Formular und MySQL-Datenbank).
Jetzt bin ich hier bei 2 Anforderungen aber auf Probleme gestoßen und bin nach etlichen Versuchen, diese Fehler zu beheben, mit meinem Latein am Ende...
Auf dem Formular gibt es 3 Felder : Name, URL und Textfeld...
Zunächst zu den Anforderungen, bei denen in meinem Script Probleme auftauchen :
1. Es soll verhindert werden, dass das Formular 2mal abgesendet wird und daurch die Datenbank zugemüllt wird.
Hierzu soll ein Timestamp mittels time() in eine Textdatei (ja das ist wirklich die Anforderung) geschrieben werden und dann beim nächsten Submit wieder ausgelesen werden.
Der eingelesene Wert soll dann mit der aktuellen Zeit verglichen werden.
Stimmt die Zeit überein, ist ein Reload oder ein Doppelpost gemacht worden. In diesem Fall soll nicht in die Datenbank geschrieben werden.
2. Trifft 1 nicht zu und es darf in die Datenbank geschrieben werden, so soll vorher geprüft werden, ob Name UND Textfeld ausgefüllt worden sind.
Beide Anforderungen sollen als einzelne Funktionen in einer Datei abgelegt werden, die mittels include() eingebunden wird.
Jetzt hab ich folgende Probleme :
1. Wenn ich den Timestamp in eine Datei geschrieben habe und dann auslese, kann ich beim ersten Submit nichts abschicken, da der Vergleich logischerweise fehlschlägt (TimeStamp aus der Datei = time() ). Wie kann ich das verhindern ?
Hier mal das zugehörige Form-Element und die beiden TimeStamp-Funktionen:
Code:
<input type="hidden" value="<?=WriteTimeStamp(time());?>" name="sendonce" />
Code:
function WriteTimeStamp($time)
{
if (empty($time)) // abfangen, wenn kein Wert übergeben wurde.
{
$time = time();
}
// filename auf time.txt festlegen
$filename = "time.txt";
if(!file_exists($filename)) // Wenn die Datei nicht existiert, dann erstellen und schreiben
{
$file = fopen($filename,"w");// Datei Time.txt öffnen und Zeiger auf BOF setzen
fwrite($file,$time); // Dann den Timestamp reinschreiben
fclose($file); // und die Datei wieder schließen.
}
}
function CompareTimeStamp()
{
// nicht sehr wirksame Funktion, wenn man 1 Sek wartet, kann man
// resubmitten !
// am besten kann man für 5 Minuten diese IP-Adresse sperren.
// Filename auf time.txt setzen
$filename = "time.txt";
// Wenn refresht wurde, kann es sein, dass NICHT submitted wurde.
// Dann existiert time.txt NICHT ! es darf dann nicht versucht werden, darauf zuzugreifen !
if(file_exists($filename))
{
$file = fopen ($filename, "r");
$wrtime = fread ($file, filesize($filename));
fclose($file);
// Vergleichen und dann weiter verfahren.
if(time() == $wrtime)
{
//Bei Gleichheit, soll die Form gelöscht werden !
$return = FALSE ;
}
else // Bei Ungleichheit kann in die Datenbank geschrieben werden und dann die Timestamp Datei gelöscht werden.
{
// schreiben und Datei time.txt löschen !
if(unlink($filename))
{
// hier wird dann gelöscht.... Wenn das nicht klappt,
// dann kann ein doppelter Eintrag abgeschickt werden.
}
$return = TRUE;
}
}
return $return ;
}
Das 2te Problem tritt dann auf, wenn das Einfügen in die Datenbank zulässig wäre. Hier funktioniert die If-Bedingung anscheinend nicht, wie sie soll :
Code:
function Insert_Data($name2,$url,$text2)
{
$date = date("d.m.Y"); // Datum formatieren
$tablename = "guests"; // Tabellenname des Gästebuchs
// Insert Statement Template
// Statement absetzen
if ($text2 && $name2) // Es müssen Name UND Textfeld gefüllt werden !
{
// hier dann erst query bauen !
$query = "INSERT INTO ".$tablename."(g_id,g_Name,g_Home,g_Date,g_Comment) VALUES ('','".$name."','".$url."','".$date."','".$text."')";
if($query) // Wenn erfolgreich, dann Commit, ansonsten ggf. Rollback
{
//mysql_query($query);
// return true;
$error = "Query würde abgesetzt werden mit den Werten :<br>";
$error = $error . $name2 .",".$url.",Datum,".$text2.".";
return $error;
}
else
{
$error = "abgesetztes Statement :<br>".$query."<br>";
$error = $error."konnte nicht abgesetzt werden ! Grund :<br>";
$error = $error.mysql_error();
return $error;
}
}
else
{
$error = mysql_error();
$error = "Bitte füllen Sie Nachricht und Namen aus !";
return $error;
}
}
Das Problem hier ist folgendes : Eigentlich sollte es so sein, dass nur wenn beide Felder gefüllt sind, in die Datenbank geschrieben werden darf. Wenn ich den Namen leer lasse und die Textarea fülle, dann funktioniert diese Bedingung einwandfrei und es würde nicht geschrieben werden. Aber fülle ich den Namen und lasse die Textarea leer, dann würde immer geschrieben werden. Egal, was ich probiere, sobald der Name drinsteht scheint es egal zu sein, ob noch Text im Textfeld eingetragen ist...
Woran könnte das liegen ?
Schonmal im Voraus vielen Dank für eure Hilfestellung
Zuletzt bearbeitet: