HTML Formular mit PHP auswerten und in eine CSV-Datei speichern

Twoing

Grünschnabel
Hallo Community

Ich bin ganz neu hier und dem entsprechend habe ich nicht viel Erfahrung mit PHP.
An meiner Schule bin ich im Team, welches die Wintersporttage organisiert. Die Kids haben die Auswahl aus circa 10 Sportarten. Bis anhin, mussten wir da ziemlich viel Exceltabellen erstellen. Dies möchte ich ändern.

Ich habe ein HTML Formular erstellt (dafür reichen meine Kenntnisse noch aus).
Dafür habe ich mich schon durch etliche Tutorials gekämpft.

Ich würde gerne die eingegebenen Daten mittels PHP auswerten und sie in eine CSV-Datei speichern, damit wir die dann in Excel importieren können. Doch wie muss ich das machen?

Wie muss ich die PHP-Datei schreiben?

Schon hier funktioniert es nicht mehr?

Durch die Auswahl der post-Methode wurden die Eingaben vom Browser an den Server übertragen und stehen jetzt auf der aufgerufenen Seite im Array $_POST[] als Variablen zur Verfügung. Die Namen der Variablen entsprechen dabei den Namen der Formularfelder. Die Variable $_POST["name"] enthält also "Biff" und die Variable $_POST["nachricht"] den Text "Jemand zu Hause ?".

Die Eingaben können demnach auch ganz einfach mit dem echo-Befehl ausgegeben werden, z. Bsp. um dem Besucher nochmal anzuzeigen, welche Angaben er gemacht hat:

<?PHP

echo "Sie haben folgende Angaben gemacht:<br>";

echo "Ihr Name: $_POST[name]<br>";

echo "Ihre Nachricht $_POST[nachricht]";

?>

Wo ist dieses Array? Denn ich bekommen nur folgende Meldung im Browser:

"; echo "Dein Name: $_POST[nachname] $_POST[vorname]
"; echo "Deine Klasse: $_POST[klasse]
"; echo "Deine Sportart: $_POST[sportart]
"; echo "Skiabo ist $_POST[abo]"; ?>

Also noch einmal meine Frage: Wie und wo kommt der PHP-Code? Und mit welchen Funktionen kann ich erreichen, dass es die Daten in eine CSV-Datei schreibt, so dass sich etwa 250 Schüler eintragen können?

Ich wäre euch echt dankbar wenn ihr mir helfen könntet, ich versuche es schon seit etwa 4 Stunden und ich denke mir, dass es eigentlich recht einfach sein müsste.

Vielen Dank im Voraus
Twoing

Formularcode:

Code:
<form action="senden.php" method="post">
<p>
Name: 
  <input type="text" name="nachname">
  &nbsp;Vorname:
  <input type="text" name="vorname"> 
<p>
Schulklasse: <select name="klasse">
				<option>Bitte Klasse auswählen</option>
				<option>Klasse 1a</option>
				<option>Klasse 1b</option>
				<option>Klasse 1m</option>
				<option>Klasse 2a</option>
				<option>Klasse 2b</option>
				<option>Klasse 2m</option>
				<option>Klasse 3a</option>
				<option>Klasse 3b</option>
				<option>Klasse 3m</option>
				<option>Klasse 4a</option>
				<option>Klasse 4b</option>
				<option>Klasse 4m</option>
				<option>Klasse 5a</option>
				<option>Klasse 5b</option>
				<option>Klasse 5m</option>
				<option>Klasse 6a</option>
				<option>Klasse 6b</option>
				<option>Klasse 6m</option>
				<option>Klasse 7 Real</option>
				<option>Klasse 7 Sek</option>
				<option>Klasse 8 Real</option>
				<option>Klasse 8 Sek</option>
				<option>Klasse 9 Real</option>
				<option>Klasse 9 Sek</option>
			</select>
<p>
Sportart:	<select name="sportart">
				<option>Bitte Sportart auswählen</option>
				<option>Schlittschuhlaufen (1.-9. Klasse)</option>
				<option>Schlitteln (1.-9. Klasse)</option>
				<option>Langlauf / Skating (1.-9. Klasse)</option>
				<option>Snowboard (1.-9. Klasse, KEINE ANF&Auml;NGER)</option>
				<option>Skifahren (1.-9. Klasse)</option>
				<option>Schneeskulpturen (1.-6. Klasse)</option>
				<option>Eisstock schiessen (3.-9. Klasse)</option>
				<option>Eishockey (4.-9. Klasse)</option>
				<option>Schneeschuh wandern (4.-9. Klasse)</option>
				<option>Curling (6.-9. Klasse)</option>
			</select>
<p>
Skiabo: 	<select name="abo">
				<option>Bitte auswählen</option>
				<option>vorhanden</option>
				<option>nicht vorhanden</option>
			</select>
<p>
<input type="submit" value="Angaben absenden" />&nbsp;<input type="reset" value="Angaben löschen" />

</form>
 
Das sieht fuer mich so aus als ob das ganze nicht auf einem Webserver leuft. Jedenfalls nicht auf einem welcher PHP unterstuezt.
 
Da stimme ich TanTe zu.

Hast du die Dateien nur auf deiner lokalen Festplatte gespeichert und sie nicht über einen Webserver (z.B. XAMPP) aufgerufen?

Außerdem zum Code:

Du gibst einfach die Daten aus ohne zu überprüfen, ob z.B. sich JavaScripts da drin befinden, die schädlichen Code ausführen könnten.
Unbedingt [phpf]htmlentities[/phpf] benutzen:
PHP:
echo htmlentities($_POST['something']);
Und außerdem würde ich die empfehlen den Schlüssel beim Array in Anführungsstriche zu setzen wie im obigen Code.
 
Hallo,

neee, einfach ist es nicht, wenn man sich mit PHP so gut wie gar nicht auskennt.

Deine POST-Variablen stehen Dir in der "senden.php" zur Verfügung.

Aber erstmal würde ich Deinem Submit-Button noch einen Namen verpassen. Dann brauchst Du nachher nur noch auf den Namen prüfen und kannst den Inhalt vergessen:
HTML:
<input type="submit" value="Angaben absenden" />&nbsp;<input type="reset" value="Angaben löschen" />

<!-- wird zu -->

<input type="submit" name="senden" value="Angaben absenden" />&nbsp;<input type="reset" value="Angaben löschen" />

Darauf zugreifen kannst Du wie folgt:
PHP:
if(isset($_POST['senden'])) {   // Submit-Button gedrückt?
   foreach($_POST as $key=>$value) {   // Globales POST-ARRAY der Reihe nach durchlaufen
       if($key != 'senden') {  // den Senden-Button brauchen wir nicht
            echo $key.' hat den Wert: '.daten_reiniger($value).'<br />';
       }
   }
}


// Hauen wir alles raus, was nicht reingehört
function daten_reiniger($inhalt) {
	if (!empty($inhalt)) {
		// HTML- und PHP-Code entfernen.
		$inhalt = strip_tags($inhalt);
		// Umlaute und Sonderzeichen in HTML-Schreibweise umwandeln
		$inhalt = htmlentities($inhalt, ENT_QUOTES);
		// Entfernt überflüssige Leerzeichen am  Anfang und Ende einer Zeichenkette
		$inhalt = trim($inhalt);
		// Backslashes entfernen
		$inhalt = stripslashes($inhalt);
	}
return $inhalt;
}
Nu kannste Dir die schon mal anschauen :-) D.h., wenn ich nicht irgendwo 'n Klämmerchen übersehen habe (Mein Lieblingssport).

Und den Rest machen wir, wenn TanTe unrecht hat.

Greetz
cw
 
@comFreek

normalerweise mache ich das mit DW-CS5... aber hier beim Schreiben "inner Box" seh ich das erstmal nicht. Und wenn ich mir im Anschluss nicht noch mal alles genau durchlese, sondern gleich "weiterhusche", kann's schon mal passieren. Zumal auf meinem Monitor die ( fast so aussieht wie { - (vielleicht sollte ich auch einfach mal nur meine Brille putzen). Häufiger passiert's mir allerdings, dass ich bei zusammengesetzten Strings schon mal mit den ' und " auf Kriegsfuß stehe. Ganz schlimm wird's, wenn escaped werden muss. Einfach nur gruselig, wie das aussieht.

Greetz
cw
 
Guten Abend

Hm, ich sehe, dass es wohl doch nicht so einfach ist.

Ich habe nun dem Sende-Button den name-tag verpasst.

Übrigens verwende ich Dreamweaver 8 und lasse das ganze über XAMPP Lite laufen.

Ich stehe immer noch vor dem Problem, dass mir die senden.php nicht wirklich was Vernünftiges auswirft. Das heisst, ich weiss nicht wirklich wie ich mit dem Datenreiniger-Skript umgehen muss. Wo muss ich das einbauen? Auf der senden.php oder auf der index.html?

Ich weiss, dass ich mich im Moment aufführ wie eine totaler Vollidiot. Trotzdem möchte ich es irgendwie gerne hinkriegen, wenn es eine einfachere Lösung zu meinem Wunsch gibt, d.h. ohne PHP wäre das natürlich auch gut.

Grüsse Twoing
 
So ich habs so hinbekommen wie ich wollte:

PHP:
<?php
$nachname=$_POST['nachname'];
$vorname=$_POST['vorname'];
$klasse=$_POST['klasse'];
$sportart=$_POST['sportart'];
$abo=$_POST['abo'];
$ausgabe = $nachname. ";". $vorname. ";". $klasse. ";". $sportart. ";". $abo. ";\n";
$datei = fopen("datei.csv","a");
$output = fwrite($datei,$ausgabe);
fclose($datei);
?> 

<html>
<head>
<title>Bestätigung</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><style type="text/css">
<!--
body,td,th {
	font-family: Arial, Helvetica, sans-serif;
}
-->
</style></head>
<body>
<?php
echo "Dein Name ist: ". $vorname." ". $nachname."<br>" ;
echo "Du gehst in die ". $klasse. "."."<br>" ;
echo "Du hast folgende Sportart gewählt: ". $sportart. "<br>" ;
echo "Skiabo: ". $abo. "<br>" ;
?>
<P>
<input type="button" value="Zurück zur Eingabeseite" onclick="history.back(-1)" />

Es ist vielleicht nicht ganz die sicherste Methode, aber sie funktioniert.
Was ich noch nicht weiss ist, wie ich einen Zurück-Button machen kann, der auf der Seite, auf die er zurück geht, dort das Formular resetet... Gibt es da eine "einfache" Möglichkeit?

Gute Nacht
und vielen Dank für die Hilfe
 
Die einfachste Möglichkeit wäre, im Form-Tag action="" anzugeben und den Code der senden.php auf der Formularseite miteinzubauen und die Anzeige des Formulars über ein Flag zusteuern (oder das Formular auslagern und per include() einbinden).
PHP:
$senden=false;
if(isset($_POST['senden'])) {
  $senden=true;
// restlicher Code
}
if($senden) {
  include('meinformular.php');
} else {
  echo "Danke für die Angaben";
}
Warum soll per historyback() wieder zurück auf's Formular, wenn's einmal komplett ausgefüllt wurde? Habe ich auch mal gemacht, aber dann wieder sein lassen, weil nicht wenige gedacht haben, irgendwas hätte mit der Übertragung nicht geklappt und mir das Formular doppelt und dreifach zugesandt haben. Sollte wirklich die Notwendigkeit bestehen, dass das Formular erneut ausgefüllt werden soll (weil z.B. 3 Leute vor dem PC sitzen), dann wäre ein (erneuter) Aufruf über einen Link meines Erachtens besser.

Gut's Nächt'le
cw
 
senden.php
PHP:
<?php
function addCSV($newdata) {
    $olddata = file_get_contents('file.csv'); //liest den Inhalt der datei 
	$newdata = str_replace("vorhanden\";", "vorhanden\"\r\n", $newdata); //ersetzt am Ende das Komma gegen einen Zeilenumbruch. Achtung das verursacht Fehler falls z.B. ein Schueler den Namen vorhanden traegt^^
	$data = $olddata . $newdata; //fuegd die neuen Daten an die alten an
	file_put_contents('file.csv', $data); // schreibt die Datei
}
// Hauen wir alles raus, was nicht reingehört
function daten_reiniger($inhalt) {
    if (!empty($inhalt)) {
        // HTML- und PHP-Code entfernen.
        $inhalt = strip_tags($inhalt);
        // Umlaute und Sonderzeichen in HTML-Schreibweise umwandeln
        $inhalt = htmlentities($inhalt, ENT_QUOTES);
        // Entfernt überflüssige Leerzeichen am  Anfang und Ende einer Zeichenkette
        $inhalt = trim($inhalt);
        // Backslashes entfernen
        $inhalt = stripslashes($inhalt);
    }
return $inhalt;
}
if(isset($_POST['senden'])) {   // Submit-Button gedrückt?
   foreach($_POST as $key=>$value) {   // Globales POST-ARRAY der Reihe nach durchlaufen
       if($key != 'senden') {  // den Senden-Button brauchen wir nicht
            echo $key.' hat den Wert: '.daten_reiniger($value).'<br />';
	        $mydata .= "\"$value\";"; //jedes $value wird mit "" und , versehen und in eine variable geschrieben
       }
   }
   addCSV($mydata);
}
?>
<a href="index.html">Zurueck</a>
 
Zurück