Umleitung auf eine Seite nach Formular versenden.

mactrisha

mactrisha

Aktives Mitglied
Thread Starter
Dabei seit
27.11.2003
Beiträge
744
Reaktionspunkte
17
Hi all,

ich habe ein kleines php-Script geschrieben, das Daten aus einem hmtl-Formular per E-Mail verschicken soll. Das klappt auch. Nur: Ich will die Erfolgsausgabe nicht mit print ("<b><center>Irgendein Mitteilungstext</center></b>\n"); machen, sondern auf eine entsprechende Seite umleiten. Ich dachte mir, das geht mit header ("location: index.php");. Aber irgendwas mit meiner if-Bedingung scheint auch nicht zu stimmen, denn das Mail sendet auch ein leeres Formular und leitet aber nach dem Senden nie auf danke.php, sondern nur immer auf index.php um. Ich will nur vor dem Senden prüfen, ob das Feld "nachricht" einen Eintrag besitzt und ob der Sende-Button geklickt wurde. Wenn ja soll gemailt werden und auf die Seite danke.php umgeleitet werden. Wenn nicht, dann soll nicht gemailt werden und auf die selbe Formularseite (index.php) zurückgeleitet werden.

PHP:
/*Beim Sende-Button im Formular steht ein Hidden-Feld <input type="hidden" name="wurdegesendet" value="true">.*/
if ($nachrichteingetragen) {
/*Beim Nachrichten-Feld im Form steht ein Hidden-Feld <input type="hidden" name="nachrichteingetragen" value="true">.*/
	if ($wurdegesendet) {

/*Senden per Mail und bei Erfolg umleiten zur danke.php bei Nichterfolg zurück auf index.php.*/
		if (mail("$derempfaenger","$derbetreff","$einpaarfelderplusdienachricht\n","FROM: $derabsender\n")) {
		header ("Location: danke.php");
		} else {
		header ("Location: index.php");
		}

/*Wenn keine Nachricht eingegeben wurde, dann soll auch nicht gemailt werden, sondern nur auf index.php umgeleitet werden.*/
	} else {
	header ("Location: index.php");
	}
}

Ich weiß nicht, warum das Umleiten zur index.php funktioniert, wiegesagt, das mailen funktioniert, nur ich komme nicht auf die danke.php. Wo ist denn mein Hund begraben? Kann mir jemand bitte helfen? Hat´s was mit den Hidden-Feldern zu tun? Oder muss ich das gesamte Konzept ändern?

Salü,
mactrisha.
 
Zunächst:
  • Du weißt, was ein Schachtel-if ist?
  • Aus Formularen übergebene Variablen werden schon seit einiger Zeit mit den Arrays $_POST und $_GET angesprochen, je nachdem, welche Übertragunsmethode das Formular nutzt. Außer man hat, aus welchen Gründen auch immer, register_globals auf 'on' stehen.
  • Der Location-Header erwartet eine komplette Adresse:
    http://de.php.net/header schrieb:
    HTTP/1.1 requires an absolute URI as argument to Location: including the scheme, hostname and absolute path

Und um zu verhindern, das auf index.php umgeleitet wird, solltest du nach jedem header(); einen exit; notieren.

Matt
 
... was ein Schachtel-if ist? ...

Nein, leider. Ich bin Anfänger. Stimmt das so nicht?

... Location-Header erwartet eine komplette Adresse ...

Hieße das http://www.domain.de/verzeichnis/danke.php? Das hatte ich nämlich gelesen und auch probiert, ging nicht. Oder ist der absolute Unix-Pfad zu einer Datei gemeint?

... Arrays $_POST ...

Formular steht auf methode=post, das mit den Arrays ist mir noch zu kompliziert kriegt man es mit meinem Ansatz gar nicht hin?

Danke,
mactrisha.
 
mactrisha schrieb:
Nein, leider. Ich bin Anfänger. Stimmt das so nicht?

Es stimmt schon, es macht den Code nur schwer les- und wartbar. Schachtel-if in meinem Post ist ein Link, dort erfährst du mehr dazu.

Hieße das http://www.domain.de/verzeichnis/danke.php? Das hatte ich nämlich gelesen und auch probiert, ging nicht. Oder ist der absolute Unix-Pfad zu einer Datei gemeint?

Nein, nicht der Pfad zur Unix-Datei, sondern ein URI, wie du ihn geschrieben hast.
Formular steht auf methode=post, das mit den Arrays ist mir noch zu kompliziert kriegt man es mit meinem Ansatz gar nicht hin?

Es wäre Zufall, wenn es funktioniert.

Aber ein exit; nach jedem header(); sollte zumindest dein primäres Problem lösen.

Matt
 
Hi msslovi0,

das mit dem exit; habe ich auch schon bevor ich den Beitrag geschrieben habe gelesen, mit exit; hatte ich auch keine Umleitung. Ich schaue mir deinen Link nochmal genau an, da habe ich mehrere Hinweise gefunden und knie mich rein.

Danke,
mactrisha.
 
Aber irgendwas mit meiner if-Bedingung scheint auch nicht zu stimmen, denn das Mail sendet auch ein leeres Formular...
Das passiert weil das Script nicht die Eingabefelder überprüft sondern die "hidden"- Felder.
Ausserdem brauchst du nur ein "hidden"- Feld (<input type="hidden" name="gesendet" value="1"/>).

Hier ein Beispiel wie es funktionieren könnte (mit verschachtelten if's ;-) ):
Formular wird per POST versendet.


<?php
if($_POST['gesendet'] == 1)
{
if($_POST['nachricht'] != "")
{
$sent = mail(....);
if($sent) header("Location: http://www.domain.de/verzeichnis/danke.php");
else echo("Kann E- Mail nicht senden.");
}
else
{
header("Location: http://www.domain.de/verzeichnis/index.php");
}
}
else
{
header("Location: http://www.domain.de/verzeichnis/index.php");
}
?>
 
mal ein beispiel wie sowas aussehen könnte... benutze ich übrigens auch serh erfolgreich!

PHP:
<?php

# Empfaenger
$strEmpfaenger = 'IhrName@provider.xy';

# Absender
$strFrom       = '"Formmailer" <IhrAndererName@provider.xy>';

# Betreff
$strSubject    = 'Feedback';

# Dankseite
# Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!
$strReturnhtml = 'http://www.provider.xy/IhrName/IhreSeite.htm';

# Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?
$strDelimiter  = ":\t";

if($_POST)
{
 $strMailtext = "";

 while(list($strName,$value) = each($_POST))
 {
  if(is_array($value))
  {
   foreach($value as $value_array)
   {
    $strMailtext .= $strName.$strDelimiter.$value_array."\n";
   }
  }
  else
  {
   $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

 if(get_magic_quotes_gpc())
 {
  $strMailtext = stripslashes($strMailtext);
 }

 mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
  or die("Die Mail konnte nicht versendet werden.");
 header("Location: $strReturnhtml");
 exit;
}

?>
das als konfig über den Doctype der .php datei

PHP:
<form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">
</form>
hier das in den <body></body> tag... da kommen dann die formularfelder rein...
 
Zuletzt bearbeitet:
Zurück
Oben Unten