Hi Abbadon,
if(isset($_GET['do']) AND $_GET['do'] == "b_senden") {
sql_insert(
"beauftragen",
"GESCHLECHT, VORNAME, NACHNAME, PASSWORT, EMAIL, TELEFON, KONTAKTAUFNAME, WUNSCH",
"".$_POST['geschlecht'].",".$_POST['vorname'].",".$_POST['nachname'].",".$_POST['pw1'].",".$_POST['mail'].",".$_POST['paket'].",".$_POST['kontaktieren'].",". nl2br($_POST['wunsch']).""
);
// [...]
}
Ich weiß ja nicht, was deine Funktion sql\_insert() machen will, aber das sieht mir sehr stark nach einer Sicherheitslücke gegenüber [SQL-Injektionen](http://de.wikipedia.org/wiki/SQL-Injektion) aus.
Was erhoffst du dir eigentlich von dem Verknüpfen leerer Strings ("") vor und hinter den eigentlichen Inhalten? Warum setzt du die Werte für die Felder der Datenbank nicht in Anführungszeichen?
Desweiteren ist es nicht empfehlenswert, Daten vor dem Abspeichern bereits für die Ausgabe zu formatieren - genau das machst du hier, indem du nl2br() auf $\_POST['wunsch'] anwendest, damit bereitest du den Text nämlich für die Ausgabe in einem HTML Kontext vor. Allerdings kümmerst du dich überhaupt nicht um [Cross-Site Scripting](http://de.wikipedia.org/wiki/Cross-Site_Scripting), würde jemand HTML-Code eingeben, würdest du diesen später in der Datenbank haben mit dem von dir gewünschten <br />. Deshalb solltest du [htmlentities()](http://de2.php.net/htmlentities) bzw. [htmlspecialchars()](http://de2.php.net/htmlspecialchars) verwenden:
`$entschaerft = nl2br(htmlentities($_POST['wunsch']));`{:.language-php}
Und das schreibst du dann (nach weiterem Escapen gegen SQL-Injektionen, s.o.) in die Datenbank - das würde funktionieren. Wäre allerdings schlecht - was wäre, wenn du die Daten nun per Text E-Mail verschicken willst? Du hast in der Datenbank nur die Daten als HTML stehen! Bedenke: In einer Text E-Mail gibt es kein <br />, nur simplen Text ;-)
Aus diesem Grund solltest du Daten im Roh-Format in der Datenbank speichern (also kein nl2br(), kein htmlentities(), nur Escaping gegen SQL-Injektionen - aber das brauchst du sowieso IMMER!) und erst wenn du die Daten ausgibst, maskierst du sie entsprechend dem Kontext. Dass heißt: Wenn du sie im HTML ausgeben willst, nehme htmlentities() und falls gewünscht auch noch nl2br().
> ~~~php
if(sql_insert) {
> echo "Ihr Auftrag wurde erfolgreich gesendet.";
> }
Was willst du hier machen? Willst du wieder die Funktion sql_insert() aufrufen? Dann fehlen die Klammern hinter "sql_insert". Willst du die Rückgabe des Funktionsaufrufes von oben auswerten? Dann musst du die Rückgabe oben zwischenspeichern in eine Variable, welche du dann hier auswerten kannst.
So wie das hier ist dürfte das maximal eine Fehlermeldung von PHP geben: "Notice: Use of undefined constant sql_insert", wenn du diese nicht angezeigt bekommst, solltest du deine Einstellungen von PHP fürs Entwickeln anpassen (Stichwort error_reporting und display_errors).
<TD>GESCHLECHT</TD>
<TD><INPUT type="radio" name="geschlecht" value="mann" onchange="geschlechtm()">MANN | <INPUT type="radio" name="geschlecht" value="frau" onchange="geschlechtw()">FRAU</TD>
Auch wenn es grundsätzlich empfehlenswert ist, gerade bei Radio-Buttons solltest du auf jeden Fall [Label](http://de.selfhtml.org/html/formulare/strukturieren.htm#label) verwenden. Du erreichst damit einen besser strukturierten Quelltext und verhinderst Frustration bei Besuchern wie mir, welche es nicht leiden können, wenn man mit der Maus in den kleinen Kreis klicken muss und nicht (wie von Windows-Programmen und besseren Webseiten gewöhnt) auch einfach auf den Text daneben klicken kann, um den Radio-Button auszuwählen.
> ~~~html
<TD>VORNAME:</TD>
> <TD><INPUT type="text" size="25" name="vorname" onchange="vorname()"></TD>
Warum verwendest du kein Affenformular? Findest du nicht, dass es als Besucher äußerst nervend ist, wenn man alles noch mal neu eingeben muss, nur weil man beim Ausfüllen einen Fehler gemacht hat?
Wie du ein Affenformular in PHP bastelst, ist u.a. hier erklärt.
<TD><INPUT type="submit" value="SENDEN" name="senden" onMouseOver="senden()"/></TD>
Ich weiß ja nicht, was deine Javascript-Funktion senden() macht, aber gehe ich mal davon aus, dass sie hält, was sie verspricht, so würde dieses Formular abgesandt, sobald man mit der Maus über den Senden-Button fährt.
Was soll das? Versuchst du gezielt User zu verärgern? Du entfremdest hiermit ein Element, welches der Benutzer aus seinem täglichen Arbeiten mit dem PC sehr gut kennt: Einen Button. Jedem, der mit einem PC arbeitet, wird intuitiv bewusst sein, dass man mit einem Button etwas machen kann und zwar genau dann, wenn man draufklickt. Du aber reagierst schon auf das Überfahren des Buttons mit der Maus, wodurch du das allgemein bekannte Konzept zerstörst.
Wenn du irgendwelche Validierungen vornehmen willst, dann verwende onclick für den Submit-Button, oder onsubmit für das Formular.
Viele Grüße,
~ Dennis.