• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Welche Weiterleitungsart

Teroa

Neues Mitglied
Guten Tag,

ich habe für jemand eine Seite mit Joomla erstellt.
Dort ist ein Kontaktformular mitten in einem Beitrag eingesetzt.
Da ich dort aber kein PHP-Script ausführen kann, hab ich die mailer.php eines PHPMailers in ein Verzeichnis gepackt und lasses so per "POST" aufrufen.
Jedenfalls kann ich somit nicht im Formular selbst den Versand bestätigen oder Fehler anzeigen.
Die Standard-Kontakt Componente möchte ich nicht nutzen, da dieses Formular dann zum einen "saublöd" anzupasen ist und zudem nicht in einem Post mit anderen Informationen angezeigt werden kann.

Auf meinem Server hab ich das so realisiert, dass ich bei erfolgreichem Versand eine header-Weilterleitung auf eine Dankeseite eingestellt habe.
Bei Fehler wird eine header-Weiterleitung auf eine Fehlerseite gemacht.
Funktioniert auf meinem Server einwandfrei :)

Nun habe ich die Seite auf seinen Webspace bei 1und1 umgezogen.
Natürlich klappt dann nicht alles 100%ig. Diesesmal war das Formular betroffen.
Die E-Mail wird versand aber es erscheint die Fehlermeldung, dass der header bereits versendet wurde.
Eigentlich logisch. Es wird ja schon Code davor ausgeführt. Auf meinem Server macht das aber nichts aus.
Jedenfalls habe ich nun im im PHP Code, nachdem die Versandbestätigung, diesen Code eingefügt:
Code:
...
?>
<script type="text/javascript">
  window.location.href='http://domain.de/danke';
</script>
<?php 
...

Funktoniert auch, doch gibt es eine geringe Anzahl an User, die JavaScipt deaktiviert haben.
Es gibt ja noch die META-Weiterleitung, doch bin ich mir nicht sicher, ob dies mitten im Code gut ist, da das doch in den head-Bereich gehört.

Was ist eurer Meinung nach die bessere Lösung?
Oder habt ihr ganz andere Lösungsvorschläge?

Gruß Teroa
 
Werbung:
Wenn man header() verwendet darf in keinem Fall vorher etwas ausgegeben werden. Das kann auf deinem Server ebenso wenig funktionieren wie auf dem neuen Webspace. Die Lösung wäre (und es ist die einzige), dass Du dafür sorgst, dass vor header() keine Ausgabe stattfindet.
 
So komisch es klingt, funktioniert es auf meinem Server. Das exakt gleiche Script funktioniert dort einwandfrei.
Nach dem Versenden wird mal per header() auf eine andere Seite umgeleitet.
Vielleicht ist das auch eine falsche PHP-Einstellung, doch bin ich mit zufrieden :D Ich hänge das Script einfach mal an.

Auf meinem Server läuft: PHP Version 5.3.10-1~dotdeb.1

PHP:
<?php
require_once('class.phpmailer.php');
//include("class-smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

if (empty($_POST['name']) || empty($_POST['mail']) || empty($_POST['message'])) {
   header('Location: /fehler');
   break;
} 

if(!filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL))
{
    header('Location: /fehler');
    break;
}
 
 
$nachricht_intern = '
 
<p>Kontaktformular:<br />
Firma:          '.$_POST['firma'].'<br />
Name:           '.$_POST['name'].'<br />
Telefon:        '.$_POST['tel'].'<br />
Email:          '.$_POST['mail'].'</p>
Betreff:        '.$_POST['betreff'].'</p>
<br />
<p>Nachricht:<br />
'.$_POST['message'].'
</p>';
 

$mail             = new PHPMailer();
 
$body             = $nachricht_intern;
$mail->IsHTML(true);
//$body             = eregi_replace("[\]",'',$body);

$mail->From = $_POST['mail'];
$mail->FromName = $_POST['name'];
 
$mail->Subject    = $_POST['betreff'];
 
//$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
 
$mail->MsgHTML($body);
 
$address = '[email protected]';
$mail->AddAddress($address, 'host.de');
 
//$mail->AddAttachment("http://www.html.de/images/phpmailer.gif");      // attachment
//$mail->AddAttachment("http://www.html.de/images/phpmailer_mini.gif"); // attachment

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {  
  header('Location: /danke');
}
?>

Okay, wenn das dann nicht gehen sollte und ich es nicht mit header() machen kann, muss ich es entweder per META- oder JavaScript-Weiterleitung machen.
 
Werbung:
Dieses Verhalten von PHP kann man imho nicht einstellen. header() hat diese Eigenschaft, dass vor der Funktion keine Ausgabe sein darf. Das kann man weder an- noch abschalten. Folglich liegt dein Problem irgendwo anders. Was ist denn die genaue Fehlermeldung die Du erhältst?
 
Dieses Verhalten von PHP kann man imho nicht einstellen. header() hat diese Eigenschaft, dass vor der Funktion keine Ausgabe sein darf. Das kann man weder an- noch abschalten. Folglich liegt dein Problem irgendwo anders. Was ist denn die genaue Fehlermeldung die Du erhältst?
Die Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /homepages/3/d31037628/htdocs/joomla-cms/form/class.phpmailer.php:1) in /homepages/3/d31037628/htdocs/joomla-cms/form/mailer.php on line 62

Soweit ich das sehe wird vor dem Aufruf von header() ja auch keine Ausgabe gemacht ....
Ich denke deine Aussage hat sich durch den Fehler beantwortet.
Liegt an dem "require_once('class.phpmailer.php');" Dort ist wohl eine Ausgabe.
 
Werbung:
Also wird duch das require_once('class.phpmailer.php'); schon eine Ausgabe an den Browser gestartet. Oftmals ist das das Grundgerüst der HTML-Seite also z.B. ein <HTML> oder <BODY> oder irgend ein anderer nicht sichtbarer TAG.

Du könntest mit meta refresh arbeiten.
<meta http-equiv="refresh" content="0;URL=DEINE_URL">
 
Du könntest auch mit ob_start() und ob_end_clean() die Ausgabe aus dieser Datei unterdrücken, wenn Du sie nicht diesbezüglich anpassen willst oder kannst.

Die Verwendung der Meta-Weiterleitung würde ich nur empfehlen, wenn dieser Quellcode auch an der dafür vorgesehenen Stelle im <head> stehen kann.
 
Bin mit PHP ehr so der Anfänger. Mit ob_start() und ob_end_clean() noch nie gearbeitet.
Jedenfalls finde ich in der class.phpmailer.php keine Ausgabe.

Code zum Posten ist zu groß.
Kann die Datei auch nicht anhängen. Da funktioniert wohl was nich.

Ausgabe ist eigentlich nur echo und print oder? Keines der beiden ist jedenfalls enthalten.
 
Werbung:
Der Fehler wird durch die mailer.php von Joomla erzeugt. Du verwendest Joomla? Dann solltest Du eigentlich eher den Support für dieses CMS befragen.

PHP-Ausgaben werden mit echo, print, var_dump, print_r, session_start() und header() realisiert. Da ich die mailer.php nicht kenne, kann ich nicht beurteilen was dort das Problem ist.

EDIT: Mir fiel noch ein, dass manchmal auch fehlerhafte Zeichensätze für die Datei den Fehler verursachen. Wenn die Datei mit utf8 mit BOM gespeichert wurde, könnte das das Problem erklären.
 
hey,
ich hatte mal ein ganz ähliches problem und das hat mich fast in den Wahnsinn getrieben.

Wenn man mit verschiedenen Editionen auf verschiedenen Betriebssystemen arbeitet kann es dein das die Editoren mit den Zeichensätzen durcheinander kommen.

Dann sieht es so aus als ob die Datei mit <?php beginnen würde aber manchmal können sich davor Zeichen einschummeln die der Editor als zB.: Steuerzeichen abtut und nicht anzeigt.

Ich hab mir dann in meiner Verzweiflung einen hex-Editor heruntergeladen und mir die Datei angesehen und tatsächlich mit dem konnte ich die Zeichen löschen und es funktionierte alles wieder auf Anhieb wie gewünscht!

Hex-Editor MX - Download - CHIP Online <-- link für den hex-editor


MfG Mario

PS bei mir war der dreamweaver auf mac OSX schuld!
 
Hey, das mit dem Hex Editor werde ich mir ansehen.
Ich hab die Datei nur mit dem Notepad++ bearbeitet. Dort werden meiner meinung nach Steuerzeichen auch angezeigt.
Jedenfalls weiß ich nicht, womit das Script erstellt wurde.

Wenn das mit dem Hex-Editor nicht klappt, belasse ich das mit der Javascript Weiterleitung.

Danke schonmal an alle.
 
Werbung:
Eine Ausgabe wird auch generiert, wenn man PHP beendet und irgend etwas hinschreibt.

?>
Hallo
<?PHP

es muss also nicht zwingend ein echo oder print vorhanden sein.
BOOM wurde ja auch schon genannt und ist vor allem auf Windows-Maschinen eine Fehlerquelle.
 
Zurück
Oben