CGI für XAMPP
CGI für XAMPP
Hallo!
Ich hab die Frage zwar schon im Tips&Tricks bereich gestellt, da sie dort allerdings ignoriert wird, möchte ich hier nochmal ganz konkret fragen:
Was muss ich tun, damit ich mit einem Browser über einen Webserver (im konkreten Fall die Windows-Version von Xampp - Standardinstallation) so auf die Datei zugreifen kann, dass diese mir Daten ausgeben kann, also bspw. HTML-Seiten, Bilder, egal was...
Vielen Dank,
Simon
Ich hab die Frage zwar schon im Tips&Tricks bereich gestellt, da sie dort allerdings ignoriert wird, möchte ich hier nochmal ganz konkret fragen:
Was muss ich tun, damit ich mit einem Browser über einen Webserver (im konkreten Fall die Windows-Version von Xampp - Standardinstallation) so auf die Datei zugreifen kann, dass diese mir Daten ausgeben kann, also bspw. HTML-Seiten, Bilder, egal was...
Vielen Dank,
Simon
Windows XP Pro SP2 - PB 4.00Ich bin Ausländer - fast überall
http://localhost/test.php - müsste gehen wenn du in apachefriends\xampp\htdocs\ eine datei namens test.php hast. du kannst auch eine htmldatei hineinspeichern o.ä.
du meinst schon das oder?
du meinst schon das oder?
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping

Nein, meint er nicht. Er möchte CGI-Skripte bzw. in seinem Fall wahrscheinlichzigapeda hat geschrieben:du meinst schon das oder?
eine durch PB erstellte CGI-EXE ausführen.
Sorry, ich weiß nicht was Xampp ist, aber 'normalerweise' kann man bestimmten
Verzeichnissen (/cgi-bin/) einfach Ausführungs-Rechte geben, hierdurch wird
die EXE dann dementsprechend nicht zum Download angeboten sonder ausgeführt,
ergo würdest Du (bei entsprechender Programmierung der EXE) die Ausgabe
im Browser sehen.
Naja, vielleicht hilft diese Antwort wenigstens anderen Dir zu helfen...

Jau, also PHP ist nicht so ganz das, was ich meine, traumatic hat dafür voll und ganz ins schwarze getroffen.
XAMPP ist einfach ein für mich sehr geniales Softwarepaket, dass mir Apache, MySQL, PHP, Pear und 'n FTP und nen Mailserver (Mercury) installiert - per Installer, und ziemlich up to date. Es gibt einen cgi-bin, ich dachte, dass ich vielleicht irgendwas anderes noch beachten muss. Die Ausgabe erfolgt irgendwie über Print, oder? Muss ich bei den Compiler-Options "Console" einstellen? Und muss ich zuerst OpenConsole ausführen?
Und gibts irgendwo ein Tutorial zu den Headern? Was muss ich denn senden, bevor es zum eigentlichen Content kommt?
Simon
Deine Antwort, traumatic, hat mir auf jeden Fall schon mal geholfen, ich probiers jetzt einfach mal aus. Irgendwann wird auch try&error zum Erfolg führen...
XAMPP ist einfach ein für mich sehr geniales Softwarepaket, dass mir Apache, MySQL, PHP, Pear und 'n FTP und nen Mailserver (Mercury) installiert - per Installer, und ziemlich up to date. Es gibt einen cgi-bin, ich dachte, dass ich vielleicht irgendwas anderes noch beachten muss. Die Ausgabe erfolgt irgendwie über Print, oder? Muss ich bei den Compiler-Options "Console" einstellen? Und muss ich zuerst OpenConsole ausführen?
Und gibts irgendwo ein Tutorial zu den Headern? Was muss ich denn senden, bevor es zum eigentlichen Content kommt?
Simon
Deine Antwort, traumatic, hat mir auf jeden Fall schon mal geholfen, ich probiers jetzt einfach mal aus. Irgendwann wird auch try&error zum Erfolg führen...
Windows XP Pro SP2 - PB 4.00Ich bin Ausländer - fast überall
Diese Seite sollte helfen: http://httpd.apache.org/docs/howto/cgi.html
OpenConsole() ist AFAIK keine so gute Idee, da PureBasic den "graphic
console mode" benutzt. Hier also entweder El_Chonis CGI-Library benutzen
(kommt mit Source und Beispiel-Code) oder per API selbst eine Console
im Textmode initialisieren (ist nichts schlimmes, siehe Win32API-Docs).
Header-mäßig gilt in jedem Fall das selbe wie auch für Perl CGIs, also am
besten mal in Perl-Tutorials stöbern, auch in der PHP und Apache Doku
sind viele Infos zum Thema versteckt. Nachdem Du einen validen Header
gesendet hast, kannst Du im Grunde machen, was Du willst...
Desweiteren hat DarkDragon hier mal ein kleines Beispiel gepostet.
Trial&Error ist übrigens immer gut!
EDIT: Ich sehe gerade, den letzten Link kanntest Du ja schon
OpenConsole() ist AFAIK keine so gute Idee, da PureBasic den "graphic
console mode" benutzt. Hier also entweder El_Chonis CGI-Library benutzen
(kommt mit Source und Beispiel-Code) oder per API selbst eine Console
im Textmode initialisieren (ist nichts schlimmes, siehe Win32API-Docs).
Header-mäßig gilt in jedem Fall das selbe wie auch für Perl CGIs, also am
besten mal in Perl-Tutorials stöbern, auch in der PHP und Apache Doku
sind viele Infos zum Thema versteckt. Nachdem Du einen validen Header
gesendet hast, kannst Du im Grunde machen, was Du willst...
Desweiteren hat DarkDragon hier mal ein kleines Beispiel gepostet.
Trial&Error ist übrigens immer gut!

EDIT: Ich sehe gerade, den letzten Link kanntest Du ja schon

Ich hab früher auch ein paar CGIs für Windows geproggt, hab leider alles aus diesen einen Code verloren:
Vielleicht hilft er ja weiter.
Code: Alles auswählen
Procedure.l Send_Html(htmlcontent.s)
htmlcontent = "Content-Type: text/html"+Chr(13)+Chr(10)+Chr(13)+Chr(10)+htmlcontent
ProcedureReturn WriteFile_(getStdHandle_(#STD_OUTPUT_HANDLE),@htmlcontent,Len(htmlcontent),@xx,0)
EndProcedure
Procedure.s Get_Request()
string.s=Space(1024*5)
GetEnvironmentVariable_("QUERY_STRING",@string,1024*5)
ProcedureReturn string
EndProcedure
Procedure.s Get_Post()
ContentLength.s=Space(100)
GetEnvironmentVariable_("CONTENT_LENGTH",@ContentLength,100)
If Val(ContentLength)=0
ProcedureReturn ""
EndIf
string.s = Space(Val(ContentLength)+1)
ReadFile_(getStdHandle_(#STD_INPUT_HANDLE),@string,Val(ContentLength),@xx,0)
ProcedureReturn string
EndProcedure
Procedure.s Umformen(string.s)
tmp = FindString(string,"%",0)
While tmp
string= Left(string,tmp-1)+Chr(HexToVal(Mid(string,tmp+1,2)))+Right(string,Len(string)-(tmp+2))
tmp = FindString(string,"%",tmp+1)
Wend
ProcedureReturn string
EndProcedure
Procedure.s StringtoHtmlHex(string.s)
For i = 1 To Len(string)
tmps.s = Hex(Asc(Mid(string,i,1)))
If Len(tmps) = 1
tmps = "0"+tmps
EndIf
Result.s + "%" +tmps
Next
ProcedureReturn Result
EndProcedure
Procedure.s StringtoHtmlHex_2(string.s,zeichen.s)
tmps.s = Hex(Asc(zeichen))
If Len(tmps) = 1
tmps = "0"+tmps
EndIf
ProcedureReturn ReplaceString(string,zeichen,"%"+tmps)
EndProcedure
Procedure.s HtmlHextoString(string.s)
string = ReplaceString(string,"%0D%0A",Chr(13)+Chr(10))
string = ReplaceString(string,"+"," ")
For i = 0 To 255
string = ReplaceString(string,"%"+Right("0"+Hex(i),2),Chr(i))
Next
ProcedureReturn string
EndProcedure
Procedure.s Get_Val(string.s,var.s)
tmp = FindString("&"+string,"&"+var+"=",1)
If tmp
tmp2= FindString(string+"&","&",tmp)
If tmp2 > Len(string):tmp2-1:EndIf
tmp+Len(var)+1
ProcedureReturn Mid(string,tmp,tmp2-tmp)
EndIf
ProcedureReturn ""
EndProcedure
;---SendMail by stbi---
Global res.s, cr.s, ConnID.l
cr.s=Chr(13)+Chr(10)
Procedure Send(msg.s)
SendNetworkData(ConnID,@msg,Len(msg))
EndProcedure
Procedure.s wait()
res=""
For tmp=1 To 4999
res+" "
Next
ReceiveNetworkData(ConnID,@res,4999)
res=Left(res,3)
ProcedureReturn res
EndProcedure
Procedure.l sendmail(mailserver.s,mailto.s,mailfrom.s,subject.s,msgbody.s)
If InitNetwork()
ConnID = OpenNetworkConnection(mailserver,25)
If ConnID
wait()
error=0
If res="220"
Send("HELO CGIapp"+cr)
wait()
If res="250"
Delay(100)
Send("MAIL FROM: <"+mailfrom+">"+cr)
wait()
If res="250"
Send("RCPT TO: <"+mailto+">"+cr)
wait()
If res="250"
Send("DATA"+cr)
wait()
If res="354"
Delay(100)
Send("Date: "+cr)
Send("From: <"+mailfrom+">"+cr)
Send("To: <"+mailto+">"+cr)
Send("Subject: "+subject+cr)
Send("X-Mailer: PBMailer"+cr)
Delay(100)
Send(msgbody)
Delay(100)
Send(""+cr)
Send("."+cr)
wait()
If res="250"
Delay(100)
Send("QUIT"+cr)
wait()
ProcedureReturn 1
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
CloseNetworkConnection(ConnID)
EndIf
EndIf
EndProcedure
;---Main---
Post.s = Get_Post()
If sendmail(HtmlHextoString(Get_Val(Post,"mailserver")),HtmlHextoString(Get_Val(Post,"mailto")),HtmlHextoString(Get_Val(Post,"mailfrom")),HtmlHextoString(Get_Val(Post,"subject")),HtmlHextoString(Get_Val(Post,"content")))
Send_Html("<html><head><title>Mail sent!</title></head><body>Mail sent Successfully!</body></html>")
Else
Send_Html("<html><head><title>Error</title></head><body>Couldn't sent mail!</body></html>")
EndIf

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Hallo,
Ich schaue immer "Neueste Beiträge anzeigen" nach, sobald ich das Forum besuche, aber ich konnte mich nicht dran errinnern dass mein Thread wieder Neu war O_o.
Naja vielleicht hab ich es übersehen, ist mir aber schon desöfteren bei diesem Thread passiert, wenn das der Fall sein sollte.
Egal, unter welcher Plattform nutzt du Xampp? Ich nutze es unter Windows und Linux. Du musst die CGI natürlich unter deinem Server-Betriebssystem programmieren. All-inkl meldete mir man braucht nicht die Rechte zu verändern, damit man in Dateien schreiben kann. Dies gilt lediglich für die PHP-Scripte:
.
Es gibt allerdings auch ausnahmen, doch dies scheint mir der Standard zu sein, denn bei meinem vorinstallierten Apache unter Linux ist es auch so.
Ich schaue immer "Neueste Beiträge anzeigen" nach, sobald ich das Forum besuche, aber ich konnte mich nicht dran errinnern dass mein Thread wieder Neu war O_o.
Naja vielleicht hab ich es übersehen, ist mir aber schon desöfteren bei diesem Thread passiert, wenn das der Fall sein sollte.
Egal, unter welcher Plattform nutzt du Xampp? Ich nutze es unter Windows und Linux. Du musst die CGI natürlich unter deinem Server-Betriebssystem programmieren. All-inkl meldete mir man braucht nicht die Rechte zu verändern, damit man in Dateien schreiben kann. Dies gilt lediglich für die PHP-Scripte:
Also: niemals den chmod des CGI-Bin's verändern oder es kommt die gleiche Fehlermeldung wie bei mir das letzte malda CGI-Scripte mit Ihren normalen Userrechten ausgeführt werden, brauchen Sie keinen CHMOD von 777 setzen. Dies ist nur bei PHP-Scripten notwendig, da diese als wwwrun ausgeführt werden.

Es gibt allerdings auch ausnahmen, doch dies scheint mir der Standard zu sein, denn bei meinem vorinstallierten Apache unter Linux ist es auch so.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Vielen Dank Leute,
DDs Beispiel funktioniert Prima unter der Linux-Umgebung von meinem Hoster, ich mag aber, weil ich bei mir kein Linux installiert habe, und gerade auch zu wenig Platz dafür habe, unter Windows entwickeln.
Die Fehlerursache scheint mir auch das OpenConsole() zu sein, ohne stürzt mein Programm aber ab. Deem, dein Code hilft mir deswegen leider nicht, weils als eigenständiges Programm gemacht ist, und wohl unter Apache keine Ausgabe auf meinem Browser hinkriegt
- Ich suche jetzt also einen Weg, die Konsole ohne OpenConsole() zu öffnen, und zwar so, dass mein Server nicht mehr das liefert:
DDs Beispiel funktioniert Prima unter der Linux-Umgebung von meinem Hoster, ich mag aber, weil ich bei mir kein Linux installiert habe, und gerade auch zu wenig Platz dafür habe, unter Windows entwickeln.
Die Fehlerursache scheint mir auch das OpenConsole() zu sein, ohne stürzt mein Programm aber ab. Deem, dein Code hilft mir deswegen leider nicht, weils als eigenständiges Programm gemacht ist, und wohl unter Apache keine Ausgabe auf meinem Browser hinkriegt

500 Internal Server Error:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, admin@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Apache/2.0.53 (Win32) mod_ssl/2.0.53 OpenSSL/0.9.7f PHP/5.0.4 Server at localhost Port 80
Windows XP Pro SP2 - PB 4.00Ich bin Ausländer - fast überall
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Der Fehler ist deshalb da, da du dein CGI-Bin nicht mit den StandardRechten hast. Die rechte müssen auf 755 sein. Das war ja auch in meinem Thread der fallbluejoke hat geschrieben:Vielen Dank Leute,
DDs Beispiel funktioniert Prima unter der Linux-Umgebung von meinem Hoster, ich mag aber, weil ich bei mir kein Linux installiert habe, und gerade auch zu wenig Platz dafür habe, unter Windows entwickeln.
Die Fehlerursache scheint mir auch das OpenConsole() zu sein, ohne stürzt mein Programm aber ab. Deem, dein Code hilft mir deswegen leider nicht, weils als eigenständiges Programm gemacht ist, und wohl unter Apache keine Ausgabe auf meinem Browser hinkriegt- Ich suche jetzt also einen Weg, die Konsole ohne OpenConsole() zu öffnen, und zwar so, dass mein Server nicht mehr das liefert:
500 Internal Server Error:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, admin@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Apache/2.0.53 (Win32) mod_ssl/2.0.53 OpenSSL/0.9.7f PHP/5.0.4 Server at localhost Port 80

Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Nope, unter Windows gibt es dieses Rechte-Zeugs ja nicht.
Ich hab gerade ein Beispiel von El_Choni gefunden:
Mit dem funktioniert das jetzt auch unter Windows.
Nicht ausführen, das Beispiel funzt nur mit dem passenden Formular!
Ich schick nachher, wenn ichs hinkrieg, die Windowsversion von deinem Beispiel DD
Vielen Dank nochmal an alle,
Simon
Ich hab gerade ein Beispiel von El_Choni gefunden:
Code: Alles auswählen
hInput = GetStdHandle_(#STD_INPUT_HANDLE)
SetConsoleMode_(hInput, #ENABLE_LINE_INPUT|#ENABLE_ECHO_INPUT|#ENABLE_PROCESSED_INPUT)
*ContentLength = AllocateMemory(128)
ContentLength = Val(PeekS(*ContentLength, GetEnvironmentVariable_("CONTENT_LENGTH", *ContentLength, 128)))
FreeMemory(*ContentLength)
*Buffer = AllocateMemory(ContentLength)
ReadFile_(hInput, *Buffer, ContentLength, @bRead, 0)
Input$ = PeekS(*Buffer)
FreeMemory(*Buffer)
CloseHandle_(hInput)
hOutput = GetStdHandle_(#STD_OUTPUT_HANDLE)
HttpAnswer$ = "Content-type: text/html"+Chr(10)+Chr(13)+Chr(10)+Chr(13)+"<html><header><title>Answer from CGI</title></header><body>Hi, received your data:<br>"
HttpAnswer$+StringField(StringField(Input$, 1, "&"), 1, "=")+": "+StringField(StringField(Input$, 1, "&"), 2, "=")+"<br>"+StringField(StringField(Input$, 2, "&"), 1, "=")+": "+StringField(StringField(Input$, 2, "&"), 2, "=")
HttpAnswer$+"</body></html>"
WriteFile_(hOutput, @HttpAnswer$, Len(HttpAnswer$), @Written, 0)
CloseHandle_(hOutput)
Nicht ausführen, das Beispiel funzt nur mit dem passenden Formular!
Ich schick nachher, wenn ichs hinkrieg, die Windowsversion von deinem Beispiel DD
Vielen Dank nochmal an alle,
Simon
Windows XP Pro SP2 - PB 4.00Ich bin Ausländer - fast überall