Formulardaten automatisch an Script senden
alex
- html
0 Ed X
Hallo!
Da das wohl mit meinen 2 Scripten in einem nichts mehr wird(hab keine Lust mehr mich ganze Tage mit sowas rumzuärgern, ohne auch nur den Hauch eines Fortschritts zu sehen, es erscheint immer eine leere weiße Seite?!), hab ich mich jetzt für eine andere Variante entschlossen. Ich will in einem ersten Skript die Daten per mail an den Besteller senden und die Daten in einer Antwortseite neu ausgeben(hidden). dann soll auf dieser Seite automatisch ein Skript gestartet werden, welche die Daten aus den Hidden Fileds in die DB schreibt. Das dumme ist nur, wie mache ich das schon wieder? Ich hatte erst probiert mit refresh(script als url eingetragen), da bekomme ich einen internal server error(das Skript funktioniert aber). Auch mit SSI komme ich da nicht weiter. Gibt es da nicht sowas mit onLoad This.form.submit() oder so ähnlich? Sowas in der Art funktioniert bis jetzt aich noch nicht. Wie könnt ich das wohl am besten machen?
Gruß
Alex
Hallo alex,
Da das wohl mit meinen 2 Scripten in einem nichts mehr wird(hab keine Lust mehr mich ganze Tage mit sowas rumzuärgern, ohne auch nur den Hauch eines Fortschritts zu sehen, es erscheint immer eine leere weiße Seite?!), hab ich mich jetzt für eine andere Variante entschlossen. Ich will in einem ersten Skript die Daten per mail an den Besteller senden und die Daten in einer Antwortseite neu ausgeben(hidden). dann soll auf dieser Seite automatisch ein Skript gestartet werden, welche die Daten aus den Hidden Fileds in die DB schreibt. Das dumme ist nur, wie mache ich das schon wieder? Ich hatte erst probiert mit refresh(script als url eingetragen), da bekomme ich einen internal server error(das Skript funktioniert aber). Auch mit SSI komme ich da nicht weiter. Gibt es da nicht sowas mit onLoad This.form.submit() oder so ähnlich?
Also, ich denke es geht hier eigentlich um JavaScript. Brauchst du sowas wie?:
<body onLoad="document.forms['hiddenformname'].submit()">
Hoffe das war's was du suchst
Ed X
Hallo!
Danke, das funktioniert wunderbar - solange man Javascript eingeschaltet hat, oder? Deshalb suche ich eigentlich noch nbach einer Lösung OHNE JAVASCRIPT (hatte ich vorher nicht deutlich gesagt). Problem ist nämlich, dass zwar das Mailscript so verändern kann, wie ich will, das geht, nur das DB Script nicht, das läuft dan irgendwie nicht mehr. Jedenfalls würde ich dann das Mailscript voranstellen, aus diesem eine neue html-Seite generieren lassen die dann automatisch die Daten an das DB-Script weitersendet. Problem ist nur, wenn jetzt jemand Javascript nicht eingeschaltet hat, wird zwar am Anfang die Mail(Bestätigungsmail) an ihn selbst geschickt, aber es wird kein Eintrag in die DB gemacht, da ja ohne eingeschaltetes Javascript nichts passiert, oder?
Jedenfalls hatte ich auchmal daran gedacht, das 2. Skript direkt aus dem ersten heraus zu starten(geht das überhaupt) und die Daten zu übernehmen, ohne Umwege über html. Ginge das wohl?
Gruß
Alex
Hallo Alex!
Danke, das funktioniert wunderbar - solange man Javascript eingeschaltet hat, oder?
Nich sauer sein, aber diese JavaScript ein/aus Debatte kann mich mal analtangential. Wer es ausschaltet soll sich nicht beschweren, wenn ich ihm seine Seite nicht benutzerfreundlich mache.
Du kannst ja auch abfragen ob JavaScript geht und wenn es nicht geht den User bitten den Submitbutton zu drücken. Dann solltest du die reihen folge ändern: erst DB dann bestätigung.
Jedenfalls hatte ich auchmal daran gedacht, das 2. Skript direkt aus dem ersten heraus zu starten(geht das überhaupt) und die Daten zu übernehmen, ohne Umwege über html. Ginge das wohl?
Ich denke du solltes beider scripte zusammen fassen. Gehe dabei vom DB-script aus und baue die Mailbestätigung als Subroutine ein.
Erscheint für mich als sorgenfreieste Lösung.
Bye Ed X
Moin,
diese JavaScript ein/aus Debatte kann mich mal analtangential.
*rofl*
Viele Gruesse,
n.d.p., vom stuhl fallend (was fuer ein wortspiel ;)
Hi Ed!
Sicher, das wäre mir auch am liebsten, aber das will so einfach nicht funktionieren! Ích hab das schon Tage/Nächte lang probiert, aber auch hier im Forum konnte man mir bis jetzt leider auch noch nicht helfen. Vielleicht weißt Du ja woran es liegt:
Ich füge z.B.
&sendMail;
vor dem anderen Script ein(was mir schon geraten wurde) aber wenn ich das mache, wird zwar die mail abgeschickt, aber der DB Eintrag funktioniert nicht, direkt der erst mögliche Fehler im Script: "You did not enter through html form".
Wenn ich den Befehl dazwischen eingebe, hab ich immer den internal Server ERROR, und wenn ich es am Ende eingebe, wird zwar was in die DB geschrieben, aber es kommt keine Mail. Ich vermute das hat was mit "param" zu tun. Aber wie gesagt, mein Mailscript kenne ich 100%, aber das DB Script ist nicht von mir, deshalb weiß ich nicht, wie ich das Mailscript integrieren soll.
Vielleicht wärst Du so nett einen kurzen Blick darauf zu werfen, wenn Du Dich besser auskennst, siehst Du ja vielleicht sofort einen potentiellen Fehler! Hier hab ich das Script mal in eine html Datei gechrieben, erst beide einzeln, und danach mein Versuch, beide zu verbinden!
http://www.autotuning-shop.com/script.htm
Gruß
Alexander
Hallo Alexander,
ich muss da kurz noch was dazu schreiben.
ich mach das an vielen Stellen in meinen Applikationen so und habe da keine Probleme (Javascript kommt da nicht mal ansatzweise vor.
Was du da brauchst:
schreibe db
sende mail, schicke was an den browser.
ein Beispiel, das funktioniert (die Inhalte sind natürlich geändert)
' Success transaction,
' wir schreiben auch eine statistik
Set rs = Server.CreateObject ("ADODB.Recordset")
rs.Open "tab", dbc, adOpenStatic, adLockPessimistic, adCmdTable
rs.AddNew
rs("f1") = "SSL-f1"
rs("f2") = f2
rs("f3) = now()
rs("f4") = f4
rs("f5") = f5
rs("f6") = Session("Shof6pID")
rs("f7") = Session("f7")
rs("f8") = Session("f8")
rs("f9") = f9
rs("fa") = Session("fa")
rs("fb") = fb
rs("fc") = encrypt(fc)
rs("fd") = Session("ff")
rs("fe") = datediff("s",Session("dtmStart"),now())
rs.Update
rs.Close
dbc.Close
if (STATUS = "OK") then
' wir schreiben auch eine statistik ende
'jetzt versenden wir eine AB
statistik("aaaa;" &feld1 &";" &now() &";"&feld2 &";" &feld3 &";" &Session("feld4") &";" &Session("feld5") &";" &Session("feld7") &";" &feld6 &";" &Session("feld8") &";" &Err)
if (Session("mailto_AB") = "Ja") then
if (Session("shopper_email") <>"") then
dim mailtxt, JMail
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.Sender = Session("fy")
JMail.SenderName = Session("fx")
Jmail.ReplyTo = Session("Stmd_email")
JMail.ServerAddress = "mmailserver"
JMail.AddRecipient Session("shopper_email")
if Session("Lang") ="" or isnull(Session("Lang")) =true then
JMail.Subject = "Auftragsbestätigung" & " " & Session("Shop_name")
mailtxt = "Guten Tag "
mailtxt = mailtxt & Session("fdfd") & chr(10) & chr(10)
mailtxt = mailtxt & "gsdsdffsd: " & now() & chr(10)
mailtxt = mailtxt & Session("mail_footer")
da fehlt einiges
end if
Response.Redirect Session("Success_Url") &"?a="&a &_
"&b="&b &_
"&c="&c & _
"&d="&d &_
"&e="&e &_
"&f="&Server.UrlEncode(f) &_
"&g="&g &_
"&h="&Session("h")
Gruss
Christian
Hallo!
Danke, das funktioniert wunderbar - solange man Javascript eingeschaltet hat, oder? Deshalb suche ich eigentlich noch nbach einer Lösung OHNE JAVASCRIPT (hatte ich vorher nicht deutlich gesagt). Problem ist nämlich, dass zwar das Mailscript so verändern kann, wie ich will, das geht, nur das DB Script nicht, das läuft dan irgendwie nicht mehr. Jedenfalls würde ich dann das Mailscript voranstellen, aus diesem eine neue html-Seite generieren lassen die dann automatisch die Daten an das DB-Script weitersendet. Problem ist nur, wenn jetzt jemand Javascript nicht eingeschaltet hat, wird zwar am Anfang die Mail(Bestätigungsmail) an ihn selbst geschickt, aber es wird kein Eintrag in die DB gemacht, da ja ohne eingeschaltetes Javascript nichts passiert, oder?
Jedenfalls hatte ich auchmal daran gedacht, das 2. Skript direkt aus dem ersten heraus zu starten(geht das überhaupt) und die Daten zu übernehmen, ohne Umwege über html. Ginge das wohl?
Gruß
Alex
hi Christian!
Danke! Nur mein Problem ist, dass ich doch um bestimmte Variable an bestimmten Stellen in die Antwort-Mail zu schreiben muß ich mir die doch alle einzelnd mit Param... holen, oder? Da liegt mein eigentliches Problem! Ich habe da zwei wunderbar funktionierenden Scripte, aber wenn ichdie zusammen füge, oder eins als Sub Routine, läuft nur die eine Hälfte, je nachdem wo ich &sendMail einsetzte.
Jetzt weiß ich nicht, ob das so geht, wenn einmal automatisch alle variablen eingelesen werden, und in die DB übernommen werden,und hinterher nochmal mit param dieselben variablen geöffnet werden. Irgendetwas geht das nicht.
Außerdem, wenn ich den SendMail Teil voranstelle, kommt immer die meldung vom Script "you did not access the script trough an html form".
Das kommt hiervon (steht im Script:http://www.autotuning-shop.com/script.htm)
if($query_string !~ /\S|=/){
&produce_error(
"You Did not access the script through an HTML form"
);
}
WAS HEISST DAS?
Mir würde es schon reichen, wenn ich wüßte, wo ich das $sendMail am besten hinschreibe, und was ich am Sub-Programm verändern muß. Das müßte doch reichen, ohne dass man ein kpl. neues Script schreibt, welches nie dieselben Möglichkeiten bieten wird, wie das vorhandene DB-Script! Oder stimmt im mail-Teil was mit den Modulen nicht (use cgi...), kann der damit durcheinander kommen. Wer hat denn eine Idee? Ich weiß einfach nicht weiter.
Gruß
Alex
Hallo,
if($query_string !~ /\S|=/){
&produce_error(
"You Did not access the script through an HTML form"
);
}
WAS HEISST DAS?
Schrei nicht so;-)
Wie ich schon früher sagte, werden in beiden Scripts die CGI-Parameter eingelesen. Einmal mittels Modul CGI.pm, einmal mit selbstgeschriebenem Code.
Beim Zusammenführen beider Scripts nimmt quasi ein Teil dem anderen die Parameter weg. Dabei ist es unerheblich welcher Teil zuerst aufgerufen wird. Der zweite Teil hat immer das nachsehen.
Im Falle, daß sendMail zuerst aufgerufen wird, scheitert das read(...), wodurch $query_string leer bleibt, und daher die Fehlermeldung.
Wenn Du Dich dafür entscheidest, Die Parameter mit CGI.pm auszulesen, wiue es im MAilscript passiert, dann solltest Du diese Parameter auch für den DB-Teil verwenden.
Analysiere mal die Zeilen
<code>
read(STDIN,$query_string,$ENV{'CONTENT_LENGTH'});
$time_gap=$time_transfare_seconds+($time_transfare_minutes*60)+($time_transfare_hours*60*60);
if($query_string !~ /\S|=/){
&produce_error(
"You Did not access the script through an HTML form"
);
}
unless($csv_file=&pick_up("file",$query_string)){
&produce_error(
"You did not provide your HTML form with a CSV file path."
);
}
@pairs=split("&",$query_string);
$l=0;
foreach $pair (@pairs){
if($pair=~/[;<>&\*|]/){ &produce\_error( "Using [;<>&\\*
|] meta-characters is frobidden for security reasons."
);
}
($e_names[$l],$e_values[$l])=split("=",$pair);
$e_names[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_names[$l]=~tr/+/ /;
$e_values[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_values[$l]=~tr/+/ /;
if($e_names[$l]=~/"|,/){
$e_names[$l]=~s/"/""/g;
$e_names[$l]=""".$e_names[$l].""";
}
if($e_values[$l]=~/"|,/){
$e_values[$l]=~s/"/""/g;
$e_values[$l]=""".$e_values[$l].""";
}
$l=$l+1;
}
</code>
Dann versuche, den parameterrelevanten Teil durch CGI.pm zu ersetzen. Ist gar nicht mal so schwer.
Wichtige Bestandteile dieser Codesuppe sind read(), $query_string, @pairs, @e_names,@e_values.
Leider werden in diesem Codefragment neben dem reinen Parameterauslesen auch noch einige Modifikationen vorgenommen. Da mußt Du dann schon aufpassen.
Einen modifizierten Code will ich hier aber nicht posten, da Du ihn höchstwahrscheinlich einfach rüberkopieren würdest und nichts verstanden hast. Beim nächsten Problem würdest Du wieder anstehen, was auf Dauer Unmengen an Zeit kosten würde. Vor allem für Dich.
Deshalb mein Tip: Lerne Perl und HTTP bzw. CGI verstehen. Dann mache es selbst.
Grüße
Klaus
Hi Klaus!
Zunächst DANKE für deine AntwortEN(!!!), hatte die untere leider erst gestern abend gefunden, sorry:-)
Du hast Recht, in die Richtung überleg ich schon länger. Leider habe ich erst vor wenigen Wochen mit PERL angefangen, deshalb fehlt mir noch sehr viel Wissen, bin aber auf dem besten Wege, meine noch vorhanden(großen) Lücken langsam zu schließen! Langsa lichtet sich auch der Schleier und ich fange (DANK EUCH) an immer mehr zu verstehen! Ich hab mit den Teil schon angeguckt, aber da ich leider nicht mehr weiter weiß überlege ich, evtl. den unteren Teil zu verändern. Wenn ich den oberen Teil so belasse, kann man dann die Variablen, die ich unten verwende(die dann natürlich den Namen der input-Felder entsprechen sollten) so weiter verwenden?
Also ich hab mir den Code nochmal genauer angeguckt:
read(STDIN,$query_string,$ENV{'CONTENT_LENGTH'});
OK
$time_gap=$time_transfare_seconds+($time_transfare_minutes*60)+($time_transfare_hours*60*60);
if($query_string !~ /\S|=/){
&produce_error(
"You Did not access the script through an HTML form"
);
}
unless($csv_file=&pick_up("file",$query_string)){
&produce_error(
"You did not provide your HTML form with a CSV file path."
);
}
Kann ich den ganzen Quatsch nicht weglassen, ist doch nur dazu da, am Anfang feststelen zu können, warum es nicht läuft, oder? Reicht dafür nicht:
$csv_file=&pick_up("file",$query_string
@pairs=split("&",$query_string);
$l=0;
OK
foreach $pair (@pairs){
if($pair=~/[;<>&\*|]/){ &produce\_error( "Using [;<>&\\*
|] meta-characters is frobidden for security reasons."
);
}
($e_names[$l],$e_values[$l])=split("=",$pair);
$e_names[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_names[$l]=~tr/+/ /;
$e_values[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_values[$l]=~tr/+/ /;
Soweit so gut, ist ja eigentlich alles Standard - bis hier.
if($e_names[$l]=~/"|,/){
$e_names[$l]=~s/"/""/g;
$e_names[$l]=""".$e_names[$l].""";
}
if($e_values[$l]=~/"|,/){
$e_values[$l]=~s/"/""/g;
$e_values[$l]=""".$e_values[$l].""";
}
Und das ist nur dazu, Kommas in Punkte zu verwandeln, richtig? Da ich vorher eh Skripte habe, die das (noch) nicht können bringt das auch nichts, sowieso wird auch der letzten Formularseite eh kein Eintrag gemacht, bei dem das relevant sein könnte, der Rest steht in hidden-Fields, die schon ein oder 2 Scripte durchlaufen haben. Oder verstehe ich hier was falsch?
$l=$l+1;
heißt das, alle geraden Elemente enhalten Namen, und alle ungeraden Variablen?
}
</code>
Also, jetzt weiß (in etwa) was hier so gemacht wird. Jedenfalls verstehe ich jetzt einiges besser als vorher, unter anderem auch wie das SELFHTML Beispielscript genau funktioniert, vorher konnte ich es lediglich anpassen, ohne genau zu wissen, warum da jetzt was steht!
Aber jetzt wird es wieder kompliziert:
Ich würde jetzt diesen Teil durch
use CGI;
$query_string = new CGI;
@pairs = $query_string->param;
$l=0;
foreach $pair (@pairs)
($e_names[$l],$e_values[$l])=split("=",$pair);
$e_names[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_names[$l]=~tr/+/ /;
$e_values[$l]=~s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
$e_values[$l]=~tr/+/ /;
if($e_names[$l]=~/"|,/){
$e_names[$l]=~s/"/""/g;
$e_names[$l]=""".$e_names[$l].""";
}
if($e_values[$l]=~/"|,/){
$e_values[$l]=~s/"/""/g;
$e_values[$l]=""".$e_values[$l].""";
}
$l=$l+1;
}
Naja, ist garantiert total falsch, aber ich kenne keine Möglichkeit, Listen mit cgi.pm kpl. einzulesen, ich weiß nur, wie ich alle Variablen einzend einlese. Oder geht das in Richtung:
$pairs = $query_string->param('@pairs');
$e_names = $query_string->param('@e_names');
$e_values = $query_string->param('@e_values');
Aber da sehe ich mind. 2 Probleme, erstens ist das glaub ich gar nicht möglich, @... als param, 2. fehlt mit dann die Definition, was überhaupt Name und was Wert ist, halt das mit $l=0; und $l=$l+1;
und da es dann mit
$l_e_names=@e_names;
$l_e_values=@e_values;
weiter geht, kann das gar nicht funktionieren.
Ich kenne das leider nur, dass eine Liste, z.B. @namen eingelesen wird, und dann muß ich mir aber die einzelnen Variablen noch "von Hand" holen.
Könnte ich denn(angenommen ich bekomme diesen Teil irgendwann mal hin) dann unten die Variablen, z.B. 'email'... schon als bekannt voraussetzen und dann
$email= $query_string->param('email');
weglassen?
Eigenlich wäre mir das wie oben gesagt anders herum etwas lieber - wenn ich die Variablen unten im SendMail Unterbereich verwenden könnte, also man kann mit der ursprünglichen Methode ja auch an die Variablen, die ich für meine Mail brauche, von Hand kommen. Ist bestimmt mehr Schreibaufwand, aber ich glaube vom Programmier-Niveau etwas einfacher.
Ich dachte da an sowas, wie
$empfaenger_mail = $e_values[$email];
und das dann einfach unten im SendMail Teil so:
print MAIL "To: $empfaenger_mail\n";
einsetzten.
Oder geht das auch nicht so einfach? Ich würde dann aus dem Sub-Programm den use cgi und alles mit param löschen und dafür die Variablen wie gerade Beschrieben definieren - wenn das überhaupt geht. Was hälst Du davon? Sicher würde mir Deine vorgeschlagene Variante besser gefallen, aber da weiß ich einfach nicht weiter. Vielleicht hast Du ja noch einen kleinen Denkanstoß für mich;-))
Wie Du siehst bin ich wrklich bemüht, alles zu verstehen und selbst nach einer Lösung zu suchen, ich mache mir auch sehr viele Gedanken dazu, meist leider mit nur eher mäßigem Erfolg, aber langsam verstehe ich alles immer besser. Ich wolte mich auch nochmal ganz herzlich für Deine bisherige Hilfe bedanken, hat mir schon SEHR viel gebracht, nicht nur das ich am Script weiterkomme, sondern das Du mir hilfst PERL zu verstehen! Das ist nicht selbstverständlich, denn Du hast Dir auch Zeit genommen, auf meine Fragen die Euch bestimmt manchmal nerven, super-ausführlich zu antworten, das weiß ich zu schätzen:-) Ich weiß, es ist noch sehr viel, was ich noch lernen muß - ich bemühe mich so gut ich kann und probiere so viel wie möglich aus, ich kann Dir versichern, dass ich bestimmt keinen fertigen Code von jemandem haben möchte, sondern nur dass mir Leute so wie Du gelegentlich ein paar Denkanstöße geben oder sagen, wo meine Fehler liegen!
Mit besonders freundlichem Gruß,
Alexander