Seite 1 von 2
CGI für XAMPP
Verfasst: 21.05.2005 21:39
von bluejoke
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
Verfasst: 21.05.2005 22:31
von zigapeda
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?
Verfasst: 21.05.2005 23:20
von traumatic
zigapeda hat geschrieben:du meinst schon das oder?
Nein, meint er nicht. Er möchte CGI-Skripte bzw. in seinem Fall wahrscheinlich
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...

Verfasst: 21.05.2005 23:45
von bluejoke
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...
Verfasst: 22.05.2005 00:57
von traumatic
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 
Verfasst: 22.05.2005 01:35
von Deeem2031
Ich hab früher auch ein paar CGIs für Windows geproggt, hab leider alles aus diesen einen Code verloren:
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
Vielleicht hilft er ja weiter.
Verfasst: 22.05.2005 08:40
von DarkDragon
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:
da 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.
Also: niemals den chmod des CGI-Bin's verändern oder es kommt die gleiche Fehlermeldung wie bei mir das letzte mal

.
Es gibt allerdings auch ausnahmen, doch dies scheint mir der Standard zu sein, denn bei meinem vorinstallierten Apache unter Linux ist es auch so.
Verfasst: 22.05.2005 10:28
von bluejoke
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
Verfasst: 22.05.2005 10:49
von DarkDragon
bluejoke 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
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 fall

Verfasst: 22.05.2005 10:52
von bluejoke
Nope, unter Windows gibt es dieses Rechte-Zeugs ja nicht.
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)
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