Hallo Paul,
Ich bin ein absoluter PHP-Anfänger und habe mir ein Skript für eine Gästeliste zusammengestückelt.
wir haben alle mal klein angefangen. :-)
- komme ich mit diesem if/else nicht klar.
Hmm. So kompliziert ist das doch gar nicht.
if (bedingung)
{ anweisung; // falls bedingung zutrifft
}
else
{ anweisung // falls bedingung NICHT zutrifft
}
Es soll nur etwas in eine Datei geschrieben werden, wenn das Formularfeld auch ausgefüllt wurde, ansonsten soll gar nichts passieren. Wieso funktioniert das bei mir nicht?
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung. Deinen Programmcode hast du unten angegeben, und ich ahne, wo das Problem liegt. Aber grundsätzlich: Beschreibe genau, *was* wirklich passiert, oder *was nicht* passiert, obwohl du es erwartest.
- kann ich die Funktion noch einfacher aufrufen, als über "gaeste.php?eintragen=yes"?
Ja, du fährst mit deinem Beispiel zweigleisig. Dazu gleich mehr.
<?
Stolperfalle! Beginne die PHP-Abschnitte grundsätzlich mit <?php und vermeide die "Short Open Tags". Dieses Feature ist nämlich nicht bei allen Hostern verfügbar (und *meiner Ansicht nach* auch schlechter Stil).
$script="gaeste.php";
Das ist überflüssig. Seinen eigenen Namen hat Script jederzeit selbst zur Verfügung. So schaffst du nur eine mögliche Fehlerquelle, wenn du später mal den Namen des Scripts änderst und vergisst, diese Stelle im Code anzupassen.
if ($eintragen){
Wo hast die Variable $eintragen her? Fällt die vom Himmel?
Ja, früher war es mal üblich, dass man per GET oder POST übergebene Daten gleich als Variablen im Script zur Verfügung hatte. Das ist aber unsauber, birgt Fehlerquellen und Risiken, und deshalb wird dringend davon abgeraten. Bei vielen Hostern ist dieses zweifelhafte "Feature" daher schon abgestellt.
Stattdessen frage bitte die übergebenen Parameter direkt ab. Dazu solltest du dich aber mal für *eine* Art der Übergabe entscheiden, momentan nutzt du noch GET und POST gleichzeitig. Hier erscheint mir POST angemessen, also:
if (isset($_POST['eintragen'])) ...
Ich habe hier nicht nur den Wert des Parameters abgefragt, sondern dessen Vorhandensein. Das ist sinnvoll, damit das Script keine Fehlermeldung auswirft, wenn der Wert fehlt, sondern einfach still gar nichts tut.
eintragen($name, $script);
Für $name gilt dasselbe, was ich für $eintragen schon erwähnte, und den Scriptnamen benutzt du innerhalb der Funktion gar nicht. Weg damit! Und für $name wollen wir einen Ersatzwert vorsehen, falls der Parameter fehlt. Also:
$name = (isset($_POST['name']) ? $_POST['name'] : "");
eintragen($name);
Hier wird also erst abgefragt, ob $_POST['name'] existiert, und falls ja, dessen Wert an $name zugewiesen, andernfalls ein Leerstring.
Natürlich muss dann der Funktionskopf auch dementsprechend gekürzt werden:
function eintragen($name)
if (isset($name))
Dadurch, dass wir eingangs dafür gesorgt haben, dass $name auf jeden Fall existiert, können wir hier auf dessen Wert abfragen:
if ($name)
$datei = "test.txt";
$fp = fopen ($datei, "a");
fwrite($fp," ".$name);
fclose($fp);
Gut, das sieht soweit richtig aus - man könnte das jetzt beliebig mit einer Fehlerbehandlung aufrüsten (Fehler beim Öffnen der Datei, beim Schreiben in Datei), aber für den Anfang mag das zunächst mal funktionieren. Kleiner Tipp am Rande: Schreib doch jeden Eintrag in eine neue Zeile, indem du am Ende des Eintrags einen Zeilenumbruch setzt:
fwrite($fp, $name . "\n");
<form method="post" action="<? echo $script; ?>?eintragen=yes">
Hier fehlt erstes das gesamte Grundgerüst für eine gültige HTML-Datei, zweitens ist dieses Formular in der Form unsinnig. Du definierst method="post", hängst aber den Paramter ?eintragen=yes in jedem Fall schon als GET-Parameter mit an. Wie gesagt: Entscheide dich für *eine* Art der Übergabe; bleiben wir mal bei POST.
<form method="post" action="">
Das action-Attribut darf leer sein, das ist sogar eine recht elegante Methode, damit das Script sich selbst wieder aufruft (und das hast du ja vorher um drei Ecken auch getan).
<?
Siehe oben: Short Open Tag.
$datei = "test.txt";
$fp = fopen ($datei, "r");
$str = fread ($fp, filesize ($datei));
fclose ($fp);
echo $str;
Wenn du meinen Tipp von vorher (neue Zeile für jeden Eintrag) aufgreifen möchtest, musst du den Zeilenumbruch \n im String auch noch in einen HTML-Zeilenumbruch wandeln. Dafür bringt PHP eine Standardfunktion mit:
echo nl2br($str);
Da könnte man natürlich noch viel ergänzen, verbessern und variieren. Aber das möchtest du sicher selbst mit der Zeit herausfinden. Denk auch dran, ab und zu erstmal im PHP-Manual nachzulesen. Nicht nur die Beschreibungen der einzelnen Themen und Funktionen, sondern auch die Userkommentare sind manchmal hochinteressant.
So long,
Martin
Der Bäcker schlägt die Fliegen tot
Und macht daraus Rosinenbrot.