Weiterleitung in if-Abfrage

Hallo Experten,

wie kann ich eine PHP-Weiterleitung in einer if-Abfrage realisieren? Zunächst müssen Formulareingaben auf mögliche Fehler geprüft werden, ist alles ok, folgt die Weiterleitung. Habe es so probiert, nur das funktioniert leider nicht:

<?php if ($op == "check") { // Formular wurde gesendet. Eingaben werden getestet<br /> $check\_err = false;
 foreach($HTTP\_POST\_VARS as $p\_name=\> $p\_value) {
 $message.= "$p\_name:blush:p\_value\n";
 //Name eingetragen?
 if ($p\_name == "name") {
 if ($p\_value Fehler: bitte geben Sie Ihren Namen an!";
 $check\_err = true;
 }
 }
 //eMail, falls eingetragen, gültig?
 if ($p\_name == "email") {
 if ($p\_value \> " ") {
 $result = ereg ("^[^@]+@[^@]+\.[^@ \.]+$", $email );
 if (!$result){
 $msg\_email = " Fehler: keine gültige eMail-Adresse!
(Dieses Feld kann auch leer gelassen werden) ";
 $check\_err = true;
 }
 }
 }
 //Homepagefeld, falls nicht eingetragen, löschen
 if ($p\_name == "homepage") {
 if ($p\_value == "http://www.") {
 $homepage="";
 }
 }
 //Eintrag vorhanden?
 if ($p\_name == "nachricht") {
 if ($p\_value Fehler: kein Eintrag vorhanden!";
 $check\_err = true;
 }
 }
 }
 if (!$check\_err) {

 //Weiterleitung an Danke-Seite
 header('Location: http://www.akk-leo.de/docs/gbformdanke.php');
 [weitere Anweisungen]

Dann bekomme ich die Fehlermeldung, daß die Header-Informationen nicht gesendet werden können, da sie bereits gesendet wurden. Aber wie soll ich das denn sonst lösen, die If-Abfrage muß vor der Weiterleitung durchlaufen werden.

Vielen Dank für Hinweise!

Kerstin

Hallo Kerstin,

Dann bekomme ich die Fehlermeldung, daß die
Header-Informationen nicht gesendet werden können, da sie
bereits gesendet wurden.

Das heißt, es erfolgte bereits eine Ausgabe an den Browser bevor Du header() aufgerufen hast.

Zwei Möglichkeiten:

  1. Suche nach jeder Ausgabe an den Browser vor dem header()-Aufruf, die mindestens ein Zeichen lang ist, und entferne sie - kann eine Leerstelle, eine Leerzeile, Text oder gar HTML-Code sein. Überprüfe am besten die Skripts, ob keine Leerzeilen oder Spaces am Anfang vor <?php oder am Ende nach ?> ausgegeben werden, das ist der häufigste Fehler.

  2. Schalte ganz am Anfang Deiner Skripts (also in der ersten Zeile des 1. Skripts, das durchlaufen wird) die Ausgabepufferung ein mit ob_start(). Dies verhindert jedliche Ausgabe an den Browser, bis das Skript beendet ist oder ob_end_flush() aufgerufen wird.
    >> http://it.php.net/manual/de/function.ob-start.php

Nach der header-Umleitung mach am besten ein die(), da die Umleitungen in Browsern abgeschaltet werden können, also

 header('Location: http://www.akk-leo.de/docs/gbformdanke.php'); die();

Schönen Gruß,
Rudy

$msg_name = Fehler: bitte geben Sie Ihren Namen an! ";

hier fehlt das eröffnende Anführungszeichen übrigens…
Zum rest wurde ja schon was gesagt :wink:

$msg_name = Fehler: bitte geben Sie Ihren Namen an! ";

hier fehlt das eröffnende Anführungszeichen übrigens…
Zum rest wurde ja schon was gesagt :wink:

Das war nur ein Kopierfehler :smile:

Hallo Rudy,

Dann bekomme ich die Fehlermeldung, daß die
Header-Informationen nicht gesendet werden können, da sie
bereits gesendet wurden.

Das heißt, es erfolgte bereits eine Ausgabe an den Browser
bevor Du header() aufgerufen hast.

Ist richtig, gebe vorher ein Formular aus, in dem die Gästebucheinträge gemacht werden können. Dann werden die Einträge überprüft und ist alles ok, gesendet.

Zwei Möglichkeiten:

  1. Suche nach jeder Ausgabe an den Browser vor dem
    header()-Aufruf, die mindestens ein Zeichen lang ist, und
    entferne sie - kann eine Leerstelle, eine Leerzeile, Text oder
    gar HTML-Code sein. Überprüfe am besten die Skripts, ob keine
    Leerzeilen oder Spaces am Anfang vor <?php oder am Ende
    nach ?> ausgegeben werden, das ist der häufigste Fehler.

Siehe oben, vermutlich das Formular?

  1. Schalte ganz am Anfang Deiner Skripts (also in der ersten
    Zeile des 1. Skripts, das durchlaufen wird) die
    Ausgabepufferung ein mit ob_start(). Dies verhindert jedliche
    Ausgabe an den Browser, bis das Skript beendet ist oder
    ob_end_flush() aufgerufen wird.
    >> http://it.php.net/manual/de/function.ob-start.php

Ok, hab ich mir durchgelesen, verstehe ich aber nicht so ganz.

Nach der header-Umleitung mach am besten ein die(), da die
Umleitungen in Browsern abgeschaltet werden können, also

header(‚Location:
http://www.akk-leo.de/docs/gbformdanke.php‘); die();

Geht an der Stelle leider noch nicht, da der Eintrag ja noch gespeichert werden muß.

Hier mal das komplette Skript:

<?php if ($op == "check") { // Formular wurde gesendet. Eingaben werden getestet<br /> $check\_err = false;
 foreach($HTTP\_POST\_VARS as $p\_name=\> $p\_value) {
 $message.= "$p\_name:blush:p\_value\n";
 //Name eingetragen?
 if ($p\_name == "name") {
 if ($p\_value Fehler: bitte geben Sie Ihren Namen an!";
 $check\_err = true;
 }
 }
 //eMail, falls eingetragen, gültig?
 if ($p\_name == "email") {
 if ($p\_value \> " ") {
 $result = ereg ("^[^@]+@[^@]+\.[^@ \.]+$", $email );
 if (!$result){
 $msg\_email = " Fehler: keine gültige eMail-Adresse!
(Dieses Feld kann auch leer gelassen werden) ";
 $check\_err = true;
 }
 }
 }
 //Homepagefeld, falls nicht eingetragen, löschen
 if ($p\_name == "homepage") {
 if ($p\_value == "http://www.") {
 $homepage="";
 }
 }
 //Eintrag vorhanden?
 if ($p\_name == "nachricht") {
 if ($p\_value Fehler: kein Eintrag vorhanden!";
 $check\_err = true;
 }
 }
 }
 if (!$check\_err) {

 //Weiterleitung an Danke-Seite
 header('Location: http://www.akk-leo.de/docs/gbformdanke.php');

 //Benachrichtigung per eMail über neuen Eintrag
 $admin= '[email protected]';
 $subject= 'Neuer Gästebucheintrag www.akk-leo.de';
 $message= 'neuer Gästebucheintrag von '.$name."\n\n\n";
 $message.= "$nachricht";
 mail($admin, $subject, $message, "From: $email");

 //Eintrag speichern
 $datei="../phpscript/gbeintrag.txt";
 if (isset($nachricht)) {
 $zeiger=fopen($datei,"r+");
 $alt=fread($zeiger,filesize($datei));
 //eMail-Link erstellen
 if ($email "") {
 $email="[eMail](%255C%2522mailto:%2524email%255C%2522)";
 }
 //Homepage-Link erstellen
 if ($homepage "") {
 $homepage="[Homepage](%255C%2522%2524homepage%255C%2522)";
 }
 //Prüfen, ob eMail und/oder Homepage eingegeben wurden und Kontakt entsprechend zusammensetzen
 if ($email == "" && $homepage== "") {
 $kontakt="";
 }
 if ($email == "" || $homepage== "") {
 if ($email "") {
 $kontakt="$email";
 } else {
 $kontakt="$homepage";
 }
 }
 if ($email "" && $homepage "") {
 $kontakt="$email | $homepage";
 }

 //Datum und Uhrzeit des Eintrages merken
 $datum=date("d.m.Y");
 $uhrzeit=date("H:i");

 //HTML-Zeichen maskieren, Slashes entfernen, Zeilenumbrüche erhalten
 $nachricht=htmlspecialchars($nachricht);
 $nachricht=stripslashes(nl2br($nachricht));

 //Smilies in Grafiken umwandeln
 $suche = array (":smile:",
 ":grins:",
 ":lol:",
 ":wink:",
 ":razz:",
 ":confused:",
 ":surprised:",
 ":eek:",
 ":rolleyes:",
 ":redface:",
 ":cool:",
 ":mrgreen:",
 ":mad:",
 ":sad:",
 ":cry:");

 $ersetze = array ("",
 "",
 "",
 "",
 "",
 "",
 "",
 "",
 "",
 "",
 "",
 "",
 "",
 "",
 "");

 $text = str\_replace($suche, $ersetze, $nachricht);

 //Eintrag zusammensetzen
 $eintrag="

$name schreibt am $datum um $uhrzeit Uhr:blush:text$kontakt

";

//Cursor zum Dateianfang
rewind($zeiger);

//neuen Eintrag vor alten schreiben
fputs($zeiger, „$eintrag \n $alt“);

//Datei schließen
fclose($zeiger);
}
}
}

$formular ="
Bitte füllen Sie alle Felder aus
(eMail und Homepage muß nicht, wäre aber schön):

Neuen Eintrag erstellen
Name: *
$msg_name
eMail:
$msg_email
Homepage:

Eintrag: *
$msg_nachricht
 
  
 
 
  
 
 
  
 
 
  
 
 
  
 
 
 
* Pflichtfelder

";
if ($op „check“ ) {
echo $formular;
}
if ($op == „check“) {
if ($check_err) echo $formular;
}
?>

Schönen Gruß,
Rudy

Grüße zurück,
Kerstin

Hi Kerstin,

Das heißt, es erfolgte bereits eine Ausgabe an den Browser
bevor Du header() aufgerufen hast.

Ist richtig, gebe vorher ein Formular aus, in dem die
Gästebucheinträge gemacht werden können. Dann werden die
Einträge überprüft und ist alles ok, gesendet.

Moment, das Formular ist aber nur vorher sichtbar, und nachdem ‚senden‘ gedrückt wurde, gibst Du doch nichts mehr aus, bevor Du umleitest? Das würde keinen Sinn machen, denn davon würde ein User ja nichts sehen - wenn die Umleitung funktionieren würde. Ich meinte in dem Lade-Zyklus nach dem Absenden und vor header(), da musst Du nach Ausgaben suchen, oder am Anfang ob_start() hineinsetzen.

Ok, hab ich mir durchgelesen, verstehe ich aber nicht so ganz.

Sobald Du ob_start() aufrufst, kannst Du soviel echo, print usw. machen oder HTML/Text ausgeben wie Du willst, der Browser bekommt es nicht zu sehen. Das wäre das Ziel, in dem Zyklus vor header() darf eben keine Ausgabe an den Browser erfolgen. PHP schreibt das dann in einen Zwischenpuffer, der mit ob_get_contents() ausgelesen, mit ob_end_clean() ohne Ausgabe gelöscht oder mit ob_end_flush() in einem Stück an den Browser gesendet wird. Experimentiere etwas :smile:

Nach der header-Umleitung mach am besten ein die()

Geht an der Stelle leider noch nicht, da der Eintrag ja noch
gespeichert werden muß.

Du solltest das header(‚Location…‘) ganz am Ende machen, nachdem der Eintrag erfolgt und die e-mail abgesendet worden ist. Sonst funktioniert das Eintragen und Mail-Versenden gar nicht. Sobald Du header(‚Location…‘ machst, wird sofort umgeleitet. Also das Skript sollte (nach dem Senden) folgenden Ablauf haben :

 Eingaben prüfen 
 ^
 / \
 ok Fehler
 / \
 Eintragen Formular + Fehler anzeigen
 /
 Mail Senden
 / 
 Umleiten

Im linken Ast darf zwischen ‚Eingaben prüfen‘ und ‚Umleiten‘ nichts an den Browser ausgegeben werden (auch vorher nicht, das Formular zeigst Du nur vorher oder im Fehlerfalle an), oder schalte unmittelbar vor dem ‚Eingaben prüfen‘ die Ausgabepufferung mit ob_start() ein, damit die Ausgaben den Browser nicht erreichen.

BTW: das Formular ist so nicht spamsicher, durch eine Injection in das Feld ‚name‘ und ‚message‘ kann man mit Deinem Gästebuch wunderbar Massenmails versenden. http://www.drweb.de/webmaster/kontakt-formulare.shtml

Schönen Gruß,
Rudy

Hallo Rudy,

Das heißt, es erfolgte bereits eine Ausgabe an den Browser
bevor Du header() aufgerufen hast.

Ist richtig, gebe vorher ein Formular aus, in dem die
Gästebucheinträge gemacht werden können. Dann werden die
Einträge überprüft und ist alles ok, gesendet.

Moment, das Formular ist aber nur vorher sichtbar, und nachdem
‚senden‘ gedrückt wurde, gibst Du doch nichts mehr aus, bevor
Du umleitest? Das würde keinen Sinn machen, denn davon würde
ein User ja nichts sehen - wenn die Umleitung funktionieren
würde. Ich meinte in dem Lade-Zyklus nach dem Absenden und vor
header(), da musst Du nach Ausgaben suchen, oder am Anfang
ob_start() hineinsetzen.

Nein, wenn ich auf „Senden“ klicke soll das Formular nur dann noch mal erscheinen, wenn Fehler in der Eingabe vorhanden waren.

Ok, hab ich mir durchgelesen, verstehe ich aber nicht so ganz.

Sobald Du ob_start() aufrufst, kannst Du soviel echo, print
usw. machen oder HTML/Text ausgeben wie Du willst, der Browser
bekommt es nicht zu sehen. Das wäre das Ziel, in dem Zyklus
vor header() darf eben keine Ausgabe an den Browser erfolgen.
PHP schreibt das dann in einen Zwischenpuffer, der mit
ob_get_contents() ausgelesen, mit ob_end_clean() ohne Ausgabe
gelöscht oder mit ob_end_flush() in einem Stück an den Browser
gesendet wird. Experimentiere etwas :smile:

Hab ich jetzt bestimmt 2 Stunden beigesessen, es klappt nicht :frowning:

Nach der header-Umleitung mach am besten ein die()

Geht an der Stelle leider noch nicht, da der Eintrag ja noch
gespeichert werden muß.

Du solltest das header(‚Location…‘) ganz am Ende machen,
nachdem der Eintrag erfolgt und die e-mail abgesendet worden
ist. Sonst funktioniert das Eintragen und Mail-Versenden gar
nicht. Sobald Du header(‚Location…‘ machst, wird sofort
umgeleitet. Also das Skript sollte (nach dem Senden) folgenden
Ablauf haben :

Eingaben prüfen
^
/
ok Fehler
/
Eintragen Formular + Fehler anzeigen
/
Mail Senden
/
Umleiten

Im linken Ast darf zwischen ‚Eingaben prüfen‘ und ‚Umleiten‘
nichts an den Browser ausgegeben werden (auch vorher nicht,
das Formular zeigst Du nur vorher oder im Fehlerfalle an),
oder schalte unmittelbar vor dem ‚Eingaben prüfen‘ die
Ausgabepufferung mit ob_start() ein, damit die Ausgaben den
Browser nicht erreichen.

Wie schon gesagt, klappt nicht.

BTW: das Formular ist so nicht spamsicher, durch eine
Injection in das Feld ‚name‘ und ‚message‘ kann man mit Deinem
Gästebuch wunderbar Massenmails versenden.
http://www.drweb.de/webmaster/kontakt-formulare.shtml

Danke für den Hinweis, so besser?

//Benachrichtigung per eMail über neuen Eintrag
 $txt = preg\_replace( "/(content-type:expressionless:bcc:expressionless:cc:expressionless:to:expressionless:from:smile:/im", "",$\_POST['nachricht'] );
 $message= 'neuer Gästebucheintrag von '.$name."\n\n\n";
 $message.= "$txt";
 $absender = preg\_replace( "/[^a-z0-9 !?:;,.\/\_\-=+@#$&\*\(\)]/im", "",$\_POST['email'] );
 $absender = preg\_replace( "/(content-type:expressionless:bcc:expressionless:cc:expressionless:to:expressionless:from:smile:/im", "",$absender );
 mail("[email protected]", "Neuer Gästebucheintrag www.akk-leo.de", $message, "From: $absender");

Hab ich das wenigstens richtig verstanden?

Schönen Gruß,
Rudy

Grüße,
Kerstin