Vorausschicken muss ich: Mein Wissen stammt aus "Learning Perl" von O'Reilly & Ass. und entspricht bestimmt nicht dem vollen Inhalt ... und meine Erfahrung aus der Anwendung desselben ... ich habe etwa 30 Scripts geschrieben, die prima (und schon lange) laufen. :) Also ... ich bin weder ganz Laie noch Profi ... bitte daher um Nachsicht, wenn ich manches laienhaft ausdrücke!
Jetzt habe ich eine Aufgabe, für die ich keine Antwort in meinen Unterlagen finde. :(
Das Problem:
Ich brauche ein Script ("A"), dem von einem dritten Anbieter (Zahlungsprozessor) Daten per POST übergeben werden, welche nur in einem File abgelegt werden sollen, ohne dass ein Browser im Spiel ist. (Keine weitere Rückmeldung oder Ausgabe!)
Dem gleichen Script soll (in einem anderen Zweig derselben Transaktionsmöglichkeiten) von einem Script ("B") auf meinem Server (auf dem auch Script "A" liegt) ein Datenstring per POST übergeben werden, der ebenfalls abgelegt werden soll, ohne dass ein Browser ins Spiel kommt, jedoch soll das diesen Datenstring übergebende Script nicht mit der Übergabe enden, sondern nach Absetzen der Daten eine neue Webseite anzeigen. (Das ist nur ein Sonderfall OHNE den Zahlunsgprozessor.)
Mein Script "A" schaut so aus:
#!/usr/local/bin/perl -w
unless ($testflag) { use CGI::Carp qw(fatalsToBrowser warningsToBrowser); }
use CGI qw(param);
...
hier folgt der Code, der die Daten übernimmt und ablegt - da gibt es offenbar kein Problem;
es ist kein "print ..." enthalten (schon gar nicht print "Content ... etc \n\n";)! (Aber natürlich ein paar Ausgaben an FILE.)
...
exit();
$testflag wird nur während der Testphase benutzt, ist null in der "Produktionphase".
Dieses Script scheint zu laufen, wenn es vom dritten Anbieter Daten übergeben bekommt; wenn es aber vom eigenen Server aufgerufen wird (Script "B"), dann erzeugt es einen Fehler "premature end of script header"; den bringe ich nur weg, indem ich dazufüge:
my $cgi = CGI->new();
print $cgi->header();
... aber: damit überschreibt dieses Script die offene Browserseite des auslösenden Scripts "B" ... was ja nicht sein soll. (Erstes Problem).
Das zweite Problem (die zweite Frage) hier ist:
Dieses zweite Script hat folgenden Passus:
...
print &parse_template('teilnehmer/auftrag2.htmlt'); # hier wird ein Datenstring abgeschickt
$in{'info_text'} = "<b>Gratulation:</b> Die Bestellung ist erfolgreich abgeschlossen!";
print &parse_template('txinfo.htmlt'); # hier wird $in{'info_text'} ausgeben
exit(0);
Im Template auftrag2 ist der Aufruf des o.a. Script A mit den per POST zu übergebenden Daten. Genau derselbe Passus existiert (dort mit "auftrag" statt "auftrag2") ein zweites Mal, wo allerdings ein Datenstring aus einem Formular an den externen Zahlungsprozessor geschickt wird, was ZWEI Aktionen bewirkt:
(a) Einmal wird ein Datenstring an Script A geschickt (das funktioniert offenbar), zum anderen wird
(b) die Kontrolle an "mich" (einen anderen URL, ohne Datenübergabe) zurückgegeben, wo dann eine entsprechende Seite (wieder &parse_template etc...) ausgegeben wird.
Das Problem hier: Der oben angeführte Passus (die drei Zeilen) läuft so:
Ausgabe des Datenstring: OK; dort ist ein Schalter "Absenden" inerhalb <form>...</form>, aber keine Eingabefelder, (nur "hidden"s, um den Datenstring zu formen) - das funktioniert auch, der Datenstring kommt im Script "A" korrekt an und wird dort korrekt verarbeitet;
ABER ... Script A löscht nun die aufrufende Seite mit dem Schalter (ganz leere Seite) und gibt die Kontrolle NICHT mehr an "mich" zurück, das heißt die Zeile ...
$in{'info_text'} = etc... wird nie ausgeführt.
Ich vermute, dass ich die Daten anders als per Formular übergeben muss bzw. das Script "A" anders als per Formular aufrufen muss ... aber WIE?
Ich vermute auch, dass der Fehler "premature .." von mir NICHT korrekt durch
my $cgi = CGI->new();
print $cgi->header();
behoben wurde ... und ich gestehe, dass ich diesen Teil auch nicht wirklich verstehe, sondern ihn auf der Suche nach einer Lösung meines Problems gefunden habe. Aber wie ist die korrekte Lösung?
Die konkreten Fragen daraus (sofern sie nicht durch das Aufzeigen der Fehler oben beantwortet sind):
(a) Wie muss ein Script gestaltet sein, dass es beim Aufruf NICHT an einen Browser Daten sendet? (Außer eben ... keinen http-header erzeugen)
(b) Wie muss ein Script gestaltet sein, dass es keinen "premature end of header"-Fehler erzeugt bzw. was genau sind die Ursachen dafür?
(c) Wie muss ein Script aufgerufen werden, dass es gewissermaßen aus dem Steuerungsfluß "abzweigt", ohne diesen zu beeinflußen? (Eine Rückmeldung ist hier nicht erforderlich, weil der übergebene Datenstring getrennt untersucht wird und einen Fehlerfall dann behandelt.)
Für jede Hilfe, jeden Hinweis dankbar!
Ferdl
Datum: 19.10.2006-10:03
