tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
590
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    jrx jrx ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    41
    Hallo zusammen,

    ich habe ein CGI-Programm geschrieben, welches die Methode POST auswertet.
    Im Prinzip habe das Beispielprogramm aus dem FREE-PASCAL-Buch der Herren Van
    Canneyt und Klämpfl abgetippt und ein paar kleine Erweiterungen
    hinzugefügt.

    Nun zum Problem:
    Das Programm schreibt naturgemäß nur in die Standardausgabe. Es will mir
    einfach nicht gelingen, einen Teil der Daten aus dem Programm irgendwie
    anders auszugeben.

    Das Programm soll eine Eingabe an meine Bilderdatenbank schicken, (Ein
    Parser wertet alles aus). Die Datenbankausgabe wird in eine Datei
    geschrieben, die wiederrum in mein CGI-Programm eingelesen wird (Lesen aus
    Datei klappt).

    Gibt es doch eine Möglichkeit zum Schreiben/Senden der Daten?
    mit ipc (msgtool.pp) habe ich auch schon experimentiert. Das greift das UNIT
    aber auch auf das Dateisystem zu (key := Ftok('.',ord('M')). Das hat mir
    nicht weitergeholfen. Ich habe mich aber nicht so sehr vertieft.

    Wie weiter? Eigentlich mach ich ja nichts Neuartiges.
    An den Apache-Einstellungen habe ich nichts gemacht. Nur unter SuseLinux 9.2
    eingeschaltet.

    Vielen Dank
    Jan-Rene

    Es folgt der Quelltext, der noch ziemlich Roh ist (Die 1000 Felder brauch
    ich zum Beispiel gar nicht, aber das Prinzip soll ja erst mal klappen).
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    
    uses    DOS, Sysutils, oldLinux;
    const   MaxData = 1000;
    type    DataRec = Record 
                    name, 
                    value : String; 
            end;
     
    var     Data : Array [1..MaxData] of DataRec;
            i, j, NrData : LongInt;
            c : Char;
            literal, aname : Boolean;
            f : Text;
            s : String;
     
    begin
            
            (*abgetippt und leicht verändert*)
            Writeln('Content-type: text/html');
            Writeln;
     
            if GetEnv('REQUEST_METHOD')<>'POST' then begin 
                   Writeln('POST  erwartet!');  halt(1);  end;
            
            if GetEnv('CONTENT_TYPE')<>'application/x-www-form-urlencoded'  Then begin       
                    Writeln('application/x-www-form-urlencoded erwartet!');
                    halt(1);
            end;
     
            NrData :=1;
            aname:=True;
            
            while Not Eof(input) do begin
                    literal := False;
                    read(c);
                    if c='\' Then begin
                            literal := True;
                            read(c);
                    end;
                    
                    if literal or ((c<>'=') and (c<>'&')) Then begin
                            with data[nrData] do begin
                                    if aname then name := name + c 
                                            Else value := value + c;
                            end;
                    end else begin
                            if c='&' Then begin
                                    inc(nrData);
                                    aname:=True;
                            end Else aname := False;
                    end;
            end;
            
            Writeln('<p>');
            for i:= 1 to NrData do begin
                    if length(data[i].value)>0 Then
                      for j:=1 to length(data[i].value) do 
                            // gleich die Leerzeichen wiederherstellen
                            if data[i].value[j]='+' Then data[i].value[j]:=' ' ;
                    
                    Writeln(data[i].value);
            end;
            if NrData=1 Then Writeln('&nbsp;'); 
            Writeln('</p><hr>');
            (*EndOF abgetippt*)
            
            (* hier ist der Knackpunkt, ich will auf die Festplatte des 
               Servers schreiben *)
     
            assign (f,'test'); rewrite(f);          
            Writeln(f,'PROBLEME ?');close(f);
                            
            //Warten bis die Generierung der Ausgabedatei abgeschlossen ist
            repeat until fileExists('/home/rene/jrabd.dynamic.cgi.free');
            
            //Einlesen der Daten und anzeigen
            assign(f,'/home/rene/jrabd.dynamic.cgi');
            reset(f);
            while not eof(f) do begin
                    readln(f,s);
                    Writeln(s);
            end;
            close(f);
            
            if Deletefile('/home/rene/jrabd.dynamic.cgi.free') Then;
            
            //neues Aufrufen des Programmes ermöglichen
            Writeln('Formulardaten...');
            
    end.
     

  2. #2
    WieGehts WieGehts ist offline Mitglied Gold
    Registriert seit
    Oct 2003
    Beiträge
    130
    Hallo,
    mir ist deine Frage nicht klar:
    Das Programm schreibt naturgemäß nur in die Standardausgabe. Es will mir
    einfach nicht gelingen, einen Teil der Daten aus dem Programm irgendwie
    anders auszugeben.
    Mit
    Code :
    1
    2
    
            assign (f,'test'); rewrite(f);          
            Writeln(f,'PROBLEME ?');close(f);
    schreibt du nicht mehr in die Standardausgabe, sondern in ein File. Die Standardausgabe ist der Bildschirm, welcher in deinem Source über
    Code :
    1
    
    Writeln('</p><hr>');
    angesprochen wird.
    Schreib etwas genauer, was du machen möchtest, vielleicht kann ich dir dann helfen.
     

  3. #3
    jrx jrx ist offline Mitglied Bronze
    Registriert seit
    Aug 2005
    Beiträge
    41
    Hallo WieGehts

    ich habe die Lösung im PHP Forum gefunden.
    Natürlich was mit chmod

    Ich glaube, ich mach die Verbindung zwischen Server und meinem Programm via PHP.

    Deine Anmerkung:
    Mein CGI-Programm sollte neben der Bildschirmausgabe auch in eine Datei schreiben, was es aber nicht gemacht hat.
    An der Stelle "PROBLEME ?" sollte eigentlich eine Steuersequenz für meine Bilddatenbank stehen. (Suchen usw.)

    Ich mache mit PHP weiter und habe auch ein paar Fragen...

    Vielen Dank.