Problem mit Variablen Form <-> PHP "post"

chicoconfuso

chicoconfuso

Aktives Mitglied
Thread Starter
Dabei seit
15.10.2005
Beiträge
655
Reaktionspunkte
0
So, und schon schleicht sich das nächste Problem ein.
Ich habe mir aus dem Netz ein kleines Script als Kontakt-Formular zusammen gebastelt...
Code:
Code:
<?PHP
$sendto = "mail@sts-foto.de";
$message = "
Name : $name
Email : $email

Anfrage : 
$nachricht
";
if ($action == "send") {
if ($name == "" || $betreff == "" || $nachricht == "" || !preg_match("/[.a-z0-9_-]+@+[.a-z0-9_-]+.+[.a-z0-9_-]{2,}/i", $email)) {
echo "Es ist ein Fehler aufgetreten!<br>";
echo "Bitte Überprüfen Sie, ob alle Felder korrekt ausgefüllt wurden!<br>";
} else {
mail($sendto, $betreff, $message);
echo "Ihre Nachricht wurde erfolgreich versendet!<br>";
}
}
?>

<form action="index.php?site=kontakt&action=send" method="POST">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="200" valign="middle" class="mainpage">Name :</td>
<td height="35" valign="middle"><input type="text" name="name" size="20"></td>
</tr>
<tr>
<td valign="middle" class="mainpage">E-Mail :</td>
<td height="35" valign="middle"><input type="text" name="email" size="20"></td>
</tr>
<tr>
<td height="22" valign="middle" class="mainpage">Betreff :</td>
<td height="35" valign="middle"><input type="text" name="betreff" size="20"></td>
</tr>
<tr>
<td valign="middle" class="mainpage">Anfrage :</td>
<td height="180" valign="middle"><textarea name="nachricht" cols="50" rows="10"></textarea></td>
</tr>
</table>
<div align="center">
<input type="submit" value="Abschicken"></div>
</form>

Das ganze klappt auch soweit, aaaaaber es wird immer gesagt:

Notice: Undefined variable: name in /www/htdocs/w0082ea4/content/kontakt.php on line 8

Notice: Undefined variable: email in /www/htdocs/w0082ea4/content/kontakt.php on line 10

Notice: Undefined variable: nachricht in /www/htdocs/w0082ea4/content/kontakt.php on line 12

Notice: Undefined variable: action in /www/htdocs/w0082ea4/content/kontakt.php on line 13

Das ist genau dieser Abschnitt hier:
Code:
Email : $email

Anfrage : 
$nachricht
";
if ($action == "send") {

Ich kann mir denken, das ich irgendwie die Variablen $email, $nachricht und $action definieren muss, aber wie?!
 
wenn du ein Formular mit POST übergibst, musst du auch ausdrücklich die POST-Variablen auslesen... ich denke, der Fehler kommt von dort, weil in PHP muss man die Variablen nicht audrücklich definieren (wie z.b. in Javascript)

also:

PHP:
Email: $_POST["email"]

Anfrage:
$_POST["nachricht"]
";
if( $_POST["action"] == "send") {
 
wenn du ein Formular mit POST übergibst, musst du auch ausdrücklich die POST-Variablen auslesen... ich denke, der Fehler kommt von dort, weil in PHP muss man die Variablen nicht audrücklich definieren (wie z.b. in Javascript)

also:

PHP:
Email: $_POST["email"]

Anfrage:
$_POST["nachricht"]
";
if( $_POST["action"] == "send") {

hmm, dann kommt

Parse error: syntax error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in /www/htdocs/w0082ea4/content/kontakt.php on line 8
 
Was solleigentlich immer der Zeilenumbruch zwischen $_POST["nachricht"] und dem Semikolon? :suspect:
 
Das ist kein Fehler, "nur" eine PHP-Notice. Da es keine Variablendeklarationspflicht gibt, funktioniert das trotzdem. Ausserdem ist auf den Webservern das Reporting und Anzeigen von PHP-Notizen ausgeschaltet, zumindest in der Regel.

Du arbeitest sicher lokal mit angeschaltetem Reporting (E_ALL).

Die Variablen kannst Du vorher einfach deklarieren:

Code:
$email = '';
$nachricht = '';
$action = '';

Mit diesem Snippet machst Du dem PHP-Interpreter die Variablen bekannt, indem Du sie als Leerstring deklarierst. Das Snippet muss vor dem von Dir geposteten Bereich stehen. Dieser Schritt ist aber nun hinfällig, da das $_POST-Array gebraucht wird (siehe unten).

Am Rande: Generell würde ich Variablen und Strings immer verketten und nicht einfach durcheinander in den String schreiben:

Code:
$message = "Name :" . $name . " Email :" . $email . " Anfrage :" . $nachricht;

Ausserdem hat Simusch Recht: POST-Daten müssen auch via dem entsprechenden superglobalen Array ausgelesen werden. Du hast Register_Globals auf ON, deswegen funktioniert das bei Dir. Ist ziemliches Gehacke und sicherheitstechnisch extrem bedenklich. Schalte Register_Globals generell aus!

Beispielhaft für eine Variable:

PHP:
if ( isset($_POST['email']) && !empty($_POST['email']) ) { $email = $_POST['email']; } else { $emailError = true; }

Zu obiger Zeile gehört noch eine Typen- und Validitätsprüfung, damit niemand Unsinn mit den Formularen macht, Stichwort Cross-Site-Scripting etc..

2nd
 
Zuletzt bearbeitet:
Ich habs jetzt so gemacht:
PHP:
	if ( isset($_POST['name']) && !emtpy($_POST['name']) ) { $name = $_POST['name']; } else { $nameError = true; }  
			if ( isset($_POST['email']) && !emtpy($_POST['email']) ) { $email = $_POST['email']; } else { $emailError = true; }  
			if ( isset($_POST['nachricht']) && !emtpy($_POST['nachricht']) ) { $nachricht = $_POST['nachricht']; } else { $nachrichtError = true; }  
			if ( isset($_POST['action']) && !emtpy($_POST['action']) ) { $action = $_POST['action']; } else { $actionError = true; }
			if ( isset($_POST['betreff']) && !emtpy($_POST['betreff']) ) { $betreff= $_POST['betreff']; } else { $betreffError = true; }
			if ( isset($_POST['message']) && !emtpy($_POST['message']) ) { $message= $_POST['message']; } else { $messageError = true; }  


$sendto = "mail@sts-foto.de";
$message = "Name: " . $_POST['name'] . "
Email: " . $_POST['email'] . "

Anfrage:
" . $_POST['nachricht'];
if ($_POST['action'] == "send") {
if ($_POST["name"] == "" || $_POST['betreff'] == "" || $_POST['nachricht'] == "" || !preg_match("/[.a-z0-9_-]+@+[.a-z0-9_-]+.+[.a-z0-9_-]{2,}/i", $email = $_POST['email'])) {
echo "Es ist ein Fehler aufgetreten!<br>";
echo "Bitte Überprüfen Sie, ob alle Felder korrekt ausgefüllt wurden!<br>";
} else {
mail($sendto, $_POST['betreff'], $_POST['message']);
echo "Ihre Nachricht wurde erfolgreich versendet!<br>";
}
}

Jetzt kommt zwar nicht mehr "undefined variable", sondern "undefinded index", und zwar zu: name, email, nachricht, action

und wenn ich dann auf abschicken klicke, egal ob ausgefüllt oder nicht, kommt:

Fatal error: Call to undefined function: emtpy() in /www/htdocs/w0082ea4/content/kontakt.php on line 5

line 5:
PHP:
			if ( isset($_POST['name']) && !emtpy($_POST['name']) ) { $name = $_POST['name']; } else { $nameError = true; }
 
Ich frage mich ja, warum Du die POST-Variablen an normale Variablen übergibst und dan trotzdem mit den POSTs weiterarbeitest?

Fatal error: Call to undefined function: emtpy() in /www/htdocs/w0082ea4/content/kontakt.php on line 5

Ändere mal überall emtpy in empty - das war ein Tippfehler von mir, sorry.

Und Undefined Index kommt, weil beim ersten Aufruf des Skriptes natürlich keine POST-Variablen existent sind, das Formular ist ja noch nicht abgeschickt.

Sinngemäss muss die Abarbeitung so erfolgen:

Wenn kein Formular abgeschickt sein kann (Erstaufruf, nicht auf den Sende-Button geklickt) -> zeige nur das Formular ohne Abarbeitung
Wenn Formular abgechickt ist -> dann überprüfe und übernehme Variablen aus dem POST-Array und schicke die Mail


2nd
 
okay, die fehler meldung mit empty kommt nicht mehr. hätte mir aber auch auffallen müssen, sowas lernt man ja in der schule ...

PHP:
		if ( isset($_POST['name']) && !empty($_POST['name']) ) { $name = $_POST['name']; } else { $nameError = true; }  
		if ( isset($_POST['email']) && !empty($_POST['email']) ) { $email = $_POST['email']; } else { $emailError = true; }  
		if ( isset($_POST['nachricht']) && !empty($_POST['nachricht']) ) { $nachricht = $_POST['nachricht']; } else { $nachrichtError = true; }  
		if ( isset($_POST['action']) && !empty($_POST['action']) ) { $action = $_POST['action']; } else { $actionError = true; }
		if ( isset($_POST['betreff']) && !empty($_POST['betreff']) ) { $betreff= $_POST['betreff']; } else { $betreffError = true; }
		if ( isset($_POST['message']) && !empty($_POST['message']) ) { $message= $_POST['message']; } else { $messageError = true; }  
			
		// $email = '';
		// $nachricht = '';
		// $name = '';

$sendto = "mail@sts-foto.de";
$message = "Name: " .$name . "
Email: " . $email . "

Anfrage:
" . $nachricht;

if ($action == "send") {
if ($name == "" || $betreff == "" || $nachricht == "" || !preg_match("/[.a-z0-9_-]+@+[.a-z0-9_-]+.+[.a-z0-9_-]{2,}/i", $email)) {
echo "Es ist ein Fehler aufgetreten!<br>";
echo "Bitte Überprüfen Sie, ob alle Felder korrekt ausgefüllt wurden!<br>";
} else {
mail($sendto, $betreff, $message);
echo "Ihre Nachricht wurde erfolgreich versendet!<br>";
}
}

So siehts nun aus.
Aber:


Notice: Undefined variable: name in /www/htdocs/w0082ea4/content/kontakt.php on line 17

Notice: Undefined variable: email in /www/htdocs/w0082ea4/content/kontakt.php on line 18

Notice: Undefined variable: nachricht in /www/htdocs/w0082ea4/content/kontakt.php on line 21

Notice: Undefined variable: action in /www/htdocs/w0082ea4/content/kontakt.php on line 23
 
du setzt ja die variable $name auch nur dann wenn die bedingung erfüllt ist, ansonsten ist sie überhaupt nich existent:

isset($_POST['name']) && !empty($_POST['name']) ) { $name = $_POST['name']; } else { $nameError = true; $name = ""; }

selbes dann auch für die anderen

//Edit: quatsch, wozu brauchst du denn überhaupt "$nameError"? Nenn die error-variablen doch einfach um in $name, $email, $nachricht, ...
 
ok, das hab ich jetzt dabei geschrieben.
aber jetzt tut sich gar nix. also das lädt normal, aber wenn ich auf senden gehe, dann kommt die seite wieder, so wie sie vorher war, als ob ich einfach auf refresh gedrückt habe. (eingetragen oder nicht, bei beidem)
 
änder das hier
if ($action == "send") {
mal in das:
if ($_GET['action'] == "send") {

denn die variable "action" wird ja aus dem GET, also der url geholt
 
PHP:
mail($sendto, $betreff, $message);
Du bist aber mutig. Man in den Betreff mittels Zeilenumbrüchen (\n) weitere Empfänger einfügen und so deinen Formmailer mißbrauchen. Am besten du setzt den Betreff am "Feedback" o.Ä. und fügst den Benutzer-Betreff in $message ein.

Ob das reicht, kann ich dir aber nicht sagen :) Habe mich damit nicht beschäftigt. Ich persönlich würde vermutlich ein base64_encode() über die Benutzereingaben jagen, da ist man auf jeden Fall auf der sicheren Seite ^^
 
Zuletzt bearbeitet:
//Edit: quatsch, wozu brauchst du denn überhaupt "$nameError"? Nenn die error-variablen doch einfach um in $name, $email, $nachricht, ...

Bietet sich für eine visuelle Darstellung der Fehler im Formular an. Es sei denn, mann will Fehleingaben nicht korrekt kennzeichnen und differenzieren...

2nd
 
Am besten du jagst vorher noch ein addslashes() über den Betreff rüber.

:confused: :confused: :confused: :confused:


ach ja:
habe $action in $_GET['action'] geändert:
Notice: Undefined index: action in /www/htdocs/w0082ea4/content/kontakt.php on line 23

warum GET, ich habe doch unten method="POST"?
 
ach ja:
habe $action in $_GET['action'] geändert:
Notice: Undefined index: action in /www/htdocs/w0082ea4/content/kontakt.php on line 23

warum GET, ich habe doch unten method="POST"?

Ja, für die Formular Daten, aber nicht für die Variable ACTION:

HTML:
<form action="index.php?site=kontakt&action=send" method="POST">

Die wird per $_GET an die Skripte übertragen.

Chico, ich empfehle Dir ernsthaft ein Buch bzgl. der PHP-Grundlagen. Selbst wenn das Formular laufen sollte, ist das löchrig wie ein Sieb...

2nd
 
addslashes() escaped " ' und \ also aus \n(Zeilenumbruch) wird dann \\n(kein Zeilenumbruch). Theoretisch sollte das reichen. Da ich mich damit aber schon länger nicht mehr beschäftigt habe, rate ich dir, den Betreff in die Nachricht reinzuschreiben. Da können weitere Empfänger keinen Schaden mehr anrichten. - hoffe ich
 
So, habe jetzt oben bei der Übergabe der Variable auch GET hingeschrieben und unten dann wieder nur $action.
jetzt geht es.
ja, ich werd mich da weiter rein vertiefen, aber ich brauchte sowas jetzt fix.
und eins "kaufen" bzw in auftrag geben, dazu fehlt mir im moment leider das geld.
und um mich intensiv in php einzuarbeiten die zeit :(
 
Zurück
Oben Unten