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

Identisches Script auf zwei verschiedenen Servern: Einmal Fehlerausgabe?!

Space Vampire

Senior HTML'ler
Ich hab da mal ein Problem, dass ich mir nicht so richtig erklären kann.

Ich habe ein Kontaktformular geschrieben, dass auch weitestgehend auf allen getesteten Servern einwandfrei funktioklappt hat.

Mit Ausnahme einer einzigen Funktion:
Setzen eines Zeitsperre-Cookies zum Floodschutz.

Auf meinem eigenen Server gibt es keine Fehlermeldung und der Cookie wird auch einwandfrei gesetzt.
Kontaktformular
Alles prima. Keine Fehler.

Auf dem Server meiner freundin jedoch, gibt wird die Mail vorschriftsmäßig abgesendet...aber der Cookie nicht gesetzt!
http://www.dienane.de/kreativdeko/svkontakt/index.php
Es erscheint folgende Fehlermeldung:
Code:
Warning: Cannot modify header information - headers already sent by (output started at /var/www/web89/html/kreativdeko/svkontakt/index.php:95) in /var/www/web89/html/kreativdeko/svkontakt/send.php on line 87

Da das script samt aller Einstellungen absolut identisch auf beiden Servern ist, frag ich mich, ob das an der PHP-Konfiguration auf dem Server liegen könnte?
Wenn ja: wie kann man dem entgegenwirken?

Nachfolgend die Passagen aus index.php und send.php, bei deren Auswertung der Fehler auftritt.
Die send.php wird in die index.php included

Zeile 95 der index.php
PHP:
	echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';

Zeile 87 der send.php
PHP:
setcookie("svkontakt", "svkontakt", time()+(60*$flood));

Jemand ne Idee, warum das auf einem Server geht und auf einem anderen nicht?
Und wenn ja: Was kann ich tun, damit es immer funktioniert?
 
Ok, ich bin nun schon so weit, dass es am output-buffering liegt.
was ich nicht ganz raffe, ist wie ich das outputbuffering für das script einschalten kann?
kann mir das jemand erklären?
 
nach dem session_start() das einfügen:
PHP:
ob_start();

Die Fehlermeldung lässt aber vermuten, dass ein anderer Fehler vorliegt, z.B doppelte gzip Komprimierung oder ein session_start(), wo schon etwas an den Browser gesandt wurde.
 
auf ob_start() bin ich auch noch gestoßen und damit gehts dann auch.
leider stoße ich zwangsläufig wieder auf das problem, wenn ich das script in eine seite include.
wundert mich, weil das bei anderen scripten ja auch funktioniert.
ich frag mich wie die das problem umgehen?

und das script verwendet weder sessions noch komprimierung.
eigentlich ist es nur ein sammelsurium an if-abfragen und outputs in verbindung mit einem mailversand und diesem einen einzigen cookie.
an den browser wurden bis dahin ausschließlich echos gesandt
 
Bei einem include wundert mich eine Fehlermeldung nicht, da das caching nicht irgendwo stehen darf sondern VOR einer Ausgabe aktiviert werden muss.
Ein Vergleich von phpinfo() auf den Servern könnte Aufschluss geben. Möglicherweise ist eine Konfiguration einfach restriktiver als die Andere.
 
Das Setzen von Cookies muss ebenfalls vor der ersten Ausgabe (Bereich von Nicht-PHP-Code, echo-Anweisung, ...) geschehen, da die Cookies im Header mitgeschickt werden. Du leidest unter einem EVA-Problem, wenn man so will, weil du mit der Ausgabe beginnst, während du eigentlich noch im Verarbeitungsteil bist.

Es mag sein, dass sich durch Servereinstellungen oder Output Buffering das Problem in den Griff kriegen lässt, aber die bessere Lösung ist es, so zu programmieren, dass Ausgabe erst nach Verarbeitung stattfindet (leider nicht in einem Satz zu erklären).

Workaround (siehe auch sysop):

PHP:
<?php

ob_start();
include './contact.php';
$contactForm = ob_get_clean();

?><!DOCTYPE html>

<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Meine Seite</title>
    </head>

    <body>
        <h1>Hier kommt ein Kontaktformular</h1>

        <?php echo $contactForm; ?>

    </body>

</html>
 
Ja hab ich so auch schon verstanden.
So lange ich das selber alles bei mir einsetze ist das auch kein Ding. Da hab ich ja volle Kontrolle, was ich wo ausgeben oder ausführen möchte.
Mein Problem ist, dass ich das Kontaktformular auch zum Download anbieten möchte.
Wenn das dan jemand bei sich in eine Seite included, wo bereits Ausgabe vor dem Include stattgefunden hat, muss ich ich ihm entweder ne Anleitung zumuten, wo er de buffer hinsetzen soll, oder er verzichtet auf den Floodschutz.
Beides ist für mich mehr oder weniger inakzeptabel.
Soweit ich das sehe, hätte ich aber mit Sessions das gleiche Problem...oder?
was wäre denn das kleinere Übel, frag ich mich da?!

Vielen Dank auf jeden Fall für eure Anregungen.
Auch wenn ich immer schon vorher auf die betreffenden Erkenntnisse gekommen bin, war das Brainstorming doch anregend :)
Danke also...
 
Bau die contact.php zum Beispiel so auf:

Code:
function contact_init() {}

function contact_print() {}

Anleitung dann:

PHP:
<?php

include 'contact.php';
contact_init();

?><!DOCTYPE html>

<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Meine Seite</title>
    </head>

    <body>
        <h1>Hier kommt ein Kontaktformular</h1>

        <?php contact_print(); ?>

    </body>

</html>

Das halte ich für zumutbar. :)

Dann bist du übrigens fast bei Objektorientierung.

Edit: Mit Sessions wäre es dasselbe, ja. Die nutzen auch Cookies.
 
Also ich hab auch ne frage : ich hab mir mal ein besucherzähler gedownloadet ... und der funktioniert auch gut aber : ich hab ne webspace und da drauf ne homepage und dann hab ich noch ein eigenes forum ... und bei beiden hab ich das scribt eingefügt ... abr : er zeigt wenn jetzt jemand ins forum geht zählt er den auch auf meiner hp ... is zwar eig. gut dann hab ic immer doppelt beucher aber in echt is das ja kaputt ... wie krig ich das heile ?
 
mal blöd gefragt: was hat das mit dem thema zu tun?
mal davon abgesehen, dass dein problem unter anderem mit einer zeitsperre durch cookie zu lösen ist.
oder durch zwei separate counter.txt
 
Na dann lass dir sagen, dass deine Chancen auf Hilfe sich exponentiell mit der Übereinstimmung von Problem und Thementitel steigern ;)
Aber zwei mögliche Lösungen hab ich dir ja nun schon genannt...
 
Zurück
Oben