Hi!
Ich bin grad dabei PHP zu büffeln. Als Hilfe hab ich mir das angeblich einfache Buch "PHP & MySQL von Kopf bis Fuss". Das ist soweit auch ganz gut (ausser dass die Autoren bis zum Kapitel 4 mindestens schon 20 Semikolon und Klammerfehler gemacht haben).
Ein Buch, dass PHP lehren möchte und nicht nur solche kleinen Fehler bringt sondern auch noch konzeptionelle ist in meinen Augen klar ein Sachmangel und somit reklamierbar. Eine Beseitungung der Fehler wird wohl der Händler nicht vornehmen (lassen) können, also bleibt nur die Rückgabe mit Kaufpreiserstattung. Die gleichen Fehler kannst du auch ohne Geld auszugeben in Anfängertutorials im Netz bekommen.
Nun bin ich aber bei einem Affenformular und raff da irgendwas nicht (oder es ist ein Fehler der Autoren).
Mehrere.
$von = 'elmar@machmichelvis.com';
Das Script soll ein Beispiel sein. Auch wenn dem Autor die Domain gehören sollte, wäre es besser, dem Anfänger das Verwenden der für Beispiele vorgesehehen Domainnamen beizubringen.
$betreff = $_POST['betreff'];
$text = $_POST['elvismail'];
Das sinnlose Umkopieren ist anscheinend nicht totzukriegen.
// Alles in Ordnung, Mails senden $db = mysqli\_connect('localhost', 'elmar', 'derking', 'elvis\_laden') or die('Fehler beim Verbinden mit MySQL-Server.');
or die() ist kurz und schmerzlos aber eine ganz schlechte Praxis. Zum einen bleibt durch das Sterbenlassen ein unvollständiges HTML-Dokument übrig. Zum anderen nützt das Sterbenlassen dem Anwender, der die Seite zu Gesicht bekommt, überhaupt nichts. Der kann weder was für den Fehler, er kann ihn auch nicht beseitigen und dass der MySQL-Server nicht funktioniert geht ihn gleich gar nichts an. Du als Administrator hingegen wirst von dem Fehlverhalten nicht informiert, wenn nicht gerade einer der Kunden so nett ist, dir eine Nachricht zu senden, bevor er bei der Konkurrenz einkaufen geht.
Hier wäre zu überlegen, wie im Fehlerfall dem Anwender geholfen ist, so dass er sein Anliegen auf alternative Weise los wird. Das muss so gestaltet werden, dass zum einen ein vollständiges HTML-Dokument entsteht, zum anderen du trotz des Fehlverhaltens noch an die Daten kommst, und du außerdem über den Fehler informiert wirst.
mysqli\_set\_charset($db, "utf8");
Na immerhin haben die Autoren schonmal was von Zeichenkodierung gehört.
$an = $zeile['email']; $vorname = $zeile['vorname']; $nachname = $zeile['nachname'];
Wieder sinnloses Umkopieren.
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Das unbehandelte Einfügen von $_SERVER['PHP_SELF'] ist ebenso wie ...
<input id="betreff" name="betreff" type="text" size="30"
value="<?php echo $betreff; ?>"/><br />
<textarea id="elvismail" name="elvismail" rows="8" cols="40">
<?php echo $text; ?></textarea><br />
... bei Betreff und Text eine der am häufigsten vorkommenden Sicherheitslücken, da der Kontextwechsel nicht beachtet wurde.
Beim Aufruf der Seite können nämlich Parameter (?foo=bar) angehängt werden, die in $_SERVER['PHP_SELF'] landen. Wenn man da geschickt Werte einfügt, kann man das action-Attribut mit einem " beenden und dann beliebigen HTML-Code (inklusive Javascript) einschleusen. Ein htmlspecialchars() um $_SERVER['PHP_SELF'] und Betreff und Text ist eine Pflichtveranstaltung.
Wenn ich nun die Seite lade, dann erscheint in den Formularfelder eine Fehlermeldung, dass jeweils die Variable $text und $betreff nicht definiert seien.
Dann hast du im Gegensatz zu den Autoren das error_reporting auf E_ALL stehen und erkennst solche Zugriffe auf nicht initialisierte Variablen.
Das macht meiner Meinung nach auch Sinn, da die Variablen ja nur definiert werden, wenn $_POST['submit'] gesetzt ist. Richtig?
Genau.
Aber wie müsst ich denn das nun lösen, dass keine Fehlermeldung beim ersten laden erscheint?
Achte immer darauf, dass Variablen in allen Lebenslagen initialisiert werden. Das heißt, dass sie entweder vor einem if oder sowohl in if als auch else angelegt werden. Alternativ muss beim lesenden Verwenden ihr Vorhandensein mit isset() oder auch empty() geprüft werden.
Lern das Affenformular lieber mit dem Wikipedia-Beispiel: http://de.wikipedia.org/wiki/Affenformular oder mit der PHP-FAQ: http://www.php-faq.de/q-stil-normalform.html. Letzteres wäre auch ein allgemein empfehlenswertes Tutorial.
Lo!