Formulareingabe in txt / csv Datei schreiben - und mehr...

tetsuo666

Mitglied
Hallo,

ich bastle gerade an einem Skript (auf der Grundlage von "fremden" Codeschnippseln), mit dem ich Formulareingaben in eine Textdatei oder besser CSV-Datei schreiben kann. Da vorrausichtlich mehrere Hundert Leute in kürzester Zeit auf das Formular zugreifen werden, möchte ich dass die erstellte Text/CSV-Datei während eines Zugriffes für Andere gesperrt ist. Aber zuerstmal der Code:

Hier das Formular mit sechs Variablen:
Code:
<form name="form1" method="GET" action="liste.php">
<input name="nachname" type="text" id="nachname" size="40" maxlength="40">
Name<br /><br />
<input name="vorname" type="text" id="vorname" size="40" maxlength="40">
Vorname<br /><br />
<input name="mailadresse" type="text" id="mailadresse" size="40" maxlength="40">
E-Mail<br /><br />
<input name="semester" type="text" id="semester" size="40" maxlength="40">
Semester<br /><br />
<input name="kurs" type="text" id="kurs" size="40" maxlength="40">
Kurs<br /><br />
<br />
<select name="fach" id ="fach">
  <option>Biologie Diplom</option>
  <option>Biologie Bachelor</option>
  <option>Biologie Lehramt Gym.</option>
  <option>Lebensmittelchemie</option>
  <option>Sonstiges</option>
</select>
<br /><br /><br />
<input type="submit" name="Submit" value="Abschicken">
</p>
</form>

Dann das PHP-Skript (liste.php):
PHP:
<?php
$nachname = $_GET["nachname"];
$vorname = $_GET["vorname"];
$mailadresse = $_GET["mailadresse"];
$semester = $_GET["semester"];
$kurs = $_GET["kurs"];
$fach = $_GET["fach"];

if( isset($nachname)&& isset($vorname)&& isset($mailadresse)&& isset($semester)&& isset($kurs)&& isset($fach) && $nachname!="" && $vorname!="" && $mailadresse!="" && $semester!="" && $kurs!="" && $fach!=""){

$datei="daten.txt";
$danke="danke.txt";

flock($datei, LOCK_EX); //Ist das hier so richtig ?

$zeiger=fopen($datei,"r+");
$alt=fread($zeiger,filesize($datei));
$meinung="$vorname $nachname \n $mailadresse \n $semester \n $kurs \n $fach";

rewind($zeiger);
fputs($zeiger,"$meinung \n \n $alt");
fclose($zeiger);
// readfile($datei); //Ist im Moment auskommentiert, werde ich aber ganz löschen, da ich die Formulareingabe nicht ausgeben will, sondern die $danke (siehe oben)
readfile($danke);

}
else{
echo "Eingabefelder wurden nicht komplett ausgefüllt.";
}
?>

Nun habe ich mehrere Fragen:

1) Stimmt mein flock() Befehl so ? Kann die Datei daten.txt nicht aus Versehen "verhunzt" werden weil 2 oder mehr Benutzer gleichzeitig darin schreiben? Muss ich mit flock() auch wieder schliessen, oder reicht der fclose() Befehl ?

2) im Moment benutze ich $_GET, weil das in dem Codeschnippsel so stand. Habe aber gelesen dass man lieber $_POST benutzen sollte. Wie sieht mein Code aus wenn ich das auf POST umstelle ?

3) Mir wäre eine Ausgabe in eine (formatierte) CSV-Datei lieber, um sie später bequem in Excel verwalten zu können. Krieg das aber leider mit der Formatierung nicht hin bzw. habe überhaupt keinen Plan wie das gehen soll...

4) Wie sicher ist dieser Form der "Datensammlung" ? Es soll eine reine Anmeldung sein, daher geht es nicht um sensible Daten. Aber ein "Ausspähen" anderer Benutzer sollte wenn möglich schon verhindert werden. Am wichtigsten aber ist mir der "Über-Schreibschutz" der erstellten Datei !

P.S: Ein Eintrag in eine Datenbank kommt leider aus technischen Gründen nicht in Frage, obwohl ich - Dank des Tutorials-Forums - inzwischen einigermassen damit zurechtkäme :-)
 
Hallo!

Zu 1: Nein, für flock() wird ein Dateizeiger benötigt..... und nicht ein Dateiname.
Du musst die Datei also zuvor öffnen.
Zu 2: Variablen die per $_GET übergeben werden, werden per URL übergeben..... somit könnten die Variablen von jeder x-beliebigen Seite kommen.
Ersetze GET durch POST.
Zu 3: Dann tue es doch. ;)
Zwischen die Variablen kommt ein Semikolon, ausserdem muss jeder Datensatz in einer Zeile stehen.
Zu 4: garnicht..... man braucht nur den richtigen Dateinamen/Pfad kennen und schon kann man sich die Datei anzeigen lassen.
Du könntest die daten.txt (und sogar die danke.txt) auch in einem nicht öffentlichem Verzeichnis (sofern vorhanden) ablegen.

Aber mal was ganz anderes, bist Du Dir sicher dass Du mit jedem neuen Eintrag den vorhandenen Inhalt der daten.txt löschen willst?
Denn dieses tust Du gerade mit "r+" bei fopen().
Wenn die bisherigen Einträge erhalten bleiben sollen, dann öffne die daten.txt mit "a" (nur lesen) oder "a+" (lesen und schreiben).

Versuche es mal so (Du musst nurnoch Dein Formular auf POST ändern:
PHP:
<?php
$nachname = $_POST["nachname"];
$vorname = $_POST["vorname"];
$mailadresse = $_POST["mailadresse"];
$semester = $_POST["semester"];
$kurs = $_POST["kurs"];
$fach = $_POST["fach"];
 
if( isset($nachname)&& isset($vorname)&& isset($mailadresse)&& isset($semester)&& isset($kurs)&& isset($fach) && $nachname!="" && $vorname!="" && $mailadresse!="" && $semester!="" && $kurs!="" && $fach!="") {
 
     $datei="daten.txt";
     $danke="danke.txt";
     $zeiger = fopen($datei,"a");
 
     flock($zeiger, LOCK_EX);
 
     $meinung = $vorname.";".$nachname.";".$mailadresse.";".$semester.";".$kurs.";".$fach."\r\n";
 
     fputs($zeiger, $meinung);
     fclose($zeiger);
     readfile($danke);
} else {
     echo "Eingabefelder wurden nicht komplett ausgefüllt.";
}
?>
Gruss Dr Dau
 
Danke DrDau für deine (wiederholte) Hilfe!

1) Okay, das mit flock() leuchtet mir jetzt ein...
2) habe GET durch POST ersetzt, und es scheint auch zu funktionieren :-)
3) Was ich nicht verstehe ist, wie ich das mit der CSV Datei machen soll: In deinem Beispiel hast Du jetzt
PHP:
$meinung="$vorname $nachname \n $mailadresse \n $semester \n $kurs \n $fach";
durch
PHP:
     $meinung = $vorname.";".$nachname.";".$mailadresse.";".$semester.";".$kurs.";".$fach."\r\n";
ersetzt.

Gut, ich habe jetzt quasi die Trennung mit Semikolons. Wenn ich jetzt aber eine leere daten.csv auf den Server lade, und damit daten.txt durch daten.csv ersetze wird nicht in die csv geschrieben. Warum ?
Muss ich in der csv Datei noch etwas anlegen (Variablen etc)?

Achja, Ich nehmen jetzt
PHP:
$zeiger = fopen($datei,"a+");
, und das a+ scheint auch zu funktionieren...
 
Am Dateinamen liegt es nicht..... die Datei könnte genauso gut "foo.bar" heissen.
Ich habe eher das Gefühl dass Du lediglich die Zeile mit $meinung von mir übernommen hast..... ich habe aber noch mehr Änderungen vorgenommen. ;)
Nimm mal den gesamten Code.
 
Nee ne, hab schon deinen ganzen Code übernommen.
ich Depp habe nur vergessen die hochgeladene csv richtig zu "chmod"en :-(

Okay, es scheint jetzt soweit alles zu funktionieren! ;-)
Vielen Dank an Dich!

Zwei kleine Fragen habe ich aber noch:
Warum bleibt die Formulareingabe bei einem "history back" mit dem Browser erhalten bzw. wie könnte man die Eingabefelder löschen?
Wie kann ich die Meldung dass ein bestimmtes Eingabefeld nicht ausgefüllt wurde einbauen ?
 
Um den Formularinhalt zu löschen, könntest Du nach erfolgreichem Eintrag per header() auf das Formular weiterleiten lassen.
Nachteil ist allerdings dass Deine Danksagung nicht angezeigt wird.
Wenn Du statt zum Formular zur Danksagung weiterleiten würdest, hätte man wiederum die Möglichkeit zum (ausgefülltem) Formular zurück zugehen.
Vielleicht fällt dazu ja noch jemanden etwas ein.

Was die nicht ausgefüllten Eingabefelder angeht, würde ich in Deiner else-Anweisung prüfen ob eines (oder mehrere) der Eingabefelder nicht ausgefüllt ist und ggf. eine entsprechende Meldung ausgeben.
Ungefähr so:
PHP:
else {
     echo "Dir roten Eingabefelder wurden nicht ausgefüllt:<br><br>";
 
     $out = (empty($_POST['nachname']))?'<font style="color:red">Name</font><br>':'<font style="color:green">Name</font><br>';
     $out .= (empty($_POST['vorname']))?'<font style="color:red">Vorname</font><br>':'<font style="color:green">Vorname</font><br>';
     $out .= (empty($_POST['mailadresse']))?'<font style="color:red">E-Mail</font><br>':'<font style="color:green">E-Mail</font><br>';
     $out .= (empty($_POST['semester']))?'<font style="color:red">Semester</font><br>':'<font style="color:green">Semester</font><br>';
     $out .= (empty($_POST['kurs']))?'<font style="color:red">Kurs</font><br>':'<font style="color:green">Kurs</font><br>';
     $out .= (empty($_POST['fach']))?'<font style="color:red">Fach</font><br>':'<font style="color:green">Fach</font><br>';
  
     echo $out;
}
 
Wow - Das ist Super! Vielen Dank, genauso habe ich mir es vorgestellt!
So - also vielen Dank nochmal DrDau - jetzt werde ich mich noch dransetzen und schauen ob ich es schaffe, dass nach dem Ausfüllen nochmals eine Übersicht der Eingaben angezeigt wird, bevor die Formulareingaben geschrieben werden - Hoffentlich schaffe ich das diesmal ohne Hilfe :)

Tetsuo
 
Hallo Tutorials-Gemeinde,

muss jetzt diesen alten Thread mal wieder rausholen, da ich wieder einmal hänge:

Wie kann ich den Eintrag per PHP in eine TXT Datei limitieren? Nach bspw. 20 Einträgen sollte eine entsprechende Meldung kommen, und es nicht weiter möglich sein in diese Textdatei zu schreiben.

Meine bisherige Suche hat nichts darüber ergeben, vielleicht ist das auch gar nicht möglich ?!
Muss in diesem Falle leider auf eine Textdatei zurückgreifen, da kein MySQL etc verfügbar.

Über eine kurze Anregung wäre ich Euch sehr dankbar,

Tetsuo

// Anbei nochmal der funktionierende Code bisher:
PHP:
<?php
$nachname = $_POST["nachname"];
$vorname = $_POST["vorname"];
$mailadresse = $_POST["mailadresse"];
$semester = $_POST["semester"];
$kurs = $_POST["kurs"];
$fach = $_POST["fach"];
 
if( isset($nachname)&& isset($vorname)&& isset($mailadresse)&& isset($semester)&& isset($kurs)&& isset($fach) && $nachname!="" && $vorname!="" && $mailadresse!="" && $semester!="" && $kurs!="" && $fach!="") {
 
     $datei="daten.csv";
     $danke="danke.html";
     $zeiger = fopen($datei,"a+");
 
     flock($zeiger, LOCK_EX);
 
     $meinung = $nachname.";".$vorname.";".$mailadresse.";".$semester.";".$kurs.";".$fach."\r\n";
 
     fputs($zeiger, $meinung);
     fclose($zeiger);
     readfile($danke);
} 

else {
     echo "Dir roten Eingabefelder wurden nicht ausgefüllt:<br><br>";
 
     $out = (empty($_POST['nachname']))?'<font style="color:red">Name</font><br>':'<font style="color:green">Name</font><br>';
     $out .= (empty($_POST['vorname']))?'<font style="color:red">Vorname</font><br>':'<font style="color:green">Vorname</font><br>';
     $out .= (empty($_POST['mailadresse']))?'<font style="color:red">E-Mail</font><br>':'<font style="color:green">E-Mail</font><br>';
     $out .= (empty($_POST['semester']))?'<font style="color:red">Semester</font><br>':'<font style="color:green">Semester</font><br>';
     $out .= (empty($_POST['kurs']))?'<font style="color:red">Kurs</font><br>':'<font style="color:green">Kurs</font><br>';
     $out .= (empty($_POST['fach']))?'<font style="color:red">Fach</font><br>':'<font style="color:green">Fach</font><br>';
  
     echo $out;
} 
?> 
<br /><br />
<INPUT TYPE=BUTTON VALUE="Zurück" onClick="history.back()">
 
Zurück