2 fragen

Ruthgar

Grünschnabel
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:
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 ;
		 }
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 :

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;
	}
	
}
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 :)
 
Zuletzt bearbeitet:
Vielleicht solltest Du deinen Ansatz überdenken.

Ich habe es bei meinem Gästebuch zum Beispiel so gemacht, dass ich die IP und eine Timestamp des Eintragen mit in der DB gespeichert habe.
Wird das Formular abgeschickt, wird zunächst geprüft, ob bereits ein Eintrag mit der selben IP vorliegt. Ist das der Fall hole ich mir den Timestamp des entsprechenden Eintrages und vergleiche Ihn mit der aktuell übergebenen. Ist die Differenz kleiner als x Sekunden, wird eine Fehlermeldung ausgegeben. Ist die Differenz größer wird eingetragen.

Ich halte diesen Weg für einfacher und Du hast den Vorteil, dass auch gleich die IP mitgeloggt wird.
 
Ja, so hätte ich es auch gemacht, aber die aufgabe gibt den umgesetzten Weg leider vor. :(

Das, woran es im Augenblick mehr scheitert ist, dass der Vergleich, ob die Felder gefüllt sind immer noch nicht funktioniert. Woran auch immer das liegt.
 
Das hatte ich auch schon probiert, aber leider ohne Erfolg... Auch wenn ich die If-Abfrage verschachtele, klappt es nicht. Sobald das Namensfeld gefüllt ist, springt er sogar durch die obere If-Bedingung einfach mit durch,obwohl das $text2-Feld leer ist.

Code:
if($text2 !="")
{
       if($name2 !="")
       {
         //hier dürfte dann in die DB geschrieben werden.
       }
}
 
Also dass eine IF-Abfrage uebersprungen wird ist nicht moeglich, folglich muss irgendwas in $text2 stehen.
Gib es doch einfach mal aus um das zu ueberpruefen.
Wie holst Du die Variablen die Du der Funktion uebergibst? Uebergibst Du einfach $name2 und $text2 und holst Du diese voher aus $_POST oder $_GET ?
 
Ich übergebe an die Funktion direkt aus $_POST . Vielleicht klappt ja auch was mit der Übergabe an die Funktion nicht richtig.
Ist es besser den Aufruf so zu machen, dass direkt aus $_POST übergeben wird, oder sollte man vorher die Werte noch in Variablen schreiben ?

Code:
//So ?
Insert_Data($_POST['name'],$_POST['url'],$_POST['comment']);

// oder besser so ?
$name = $_POST['name'] ;
$url = $_POST['url'];
$comment = $_POST['comment'];
 
Ich denke es sollte keinen Unterschied machen ob Du direkt oder indirekt uebergibst.
Heisst das Textfeld denn jetzt comment oder text2
 
Zurück