Autor Beitrag
matze.de
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: Fr 10.06.05 18:53 
Hi,
Ich werde nun versuchen euch zu erklären, wie man Daten mittels HTTP-Post an einen Webserver senden kann und wie der Server diese dann verarbeiten kann.

Als erstes benötigen wir dazu ein PHP-Skript auf dem Webserver, welches unsere Daten empfängt und dann auch verarbeitet.
Fangen wir mit dem empfangen der Post Daten an:
ausblenden Quelltext
1:
2:
3:
4:
<?php
//POST Daten ermitteln und in eine Variable(hier in einem Array) speichern
$MyData[0] = $_POST["code"]; // Mit $_POST fragt man die Post-Daten ab.
?>

Im Grunde hat das Script die gesendeten Daten nun schon in einer Variable gespeichert, doch diese verfallen wieder bei Scriptende, daher wollen wir die Daten in einer *.txt Datei speichern. Wir ergänzen unser Script nun um ein paar weitere Zeilen:
ausblenden volle Höhe Quelltext
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:
<?php
//Datei
$File = getcwd()."/code.txt"; // Datei liegt immer im selben verzeichnis wie das PHP-Skript.

//POST Daten ermitteln und in eine Variable speichern
$MyData[0] = $_POST["code"]; // Mit $_POST fragt man die Post-Daten ab.


Function write($Datei, $Daten){
 $Error = False; // Unsere ErrorVariable :)
   If (!is_file($Datei)){ // Wenn die Datei nicht exisitiert -> erstellen
       $FilePointer = @fopen($Datei, "w+");
       @fclose($FilePointer);
       @chmod($Datei, 0777);
   }
   If(!is_writeable($Datei)){ // Wenn die Datei nicht schreibbar -> schreibbar machen
      If(!@chmod($Datei, 0777)){
        $Error = True;
      }
   }
   If(!$Error){
     $FilePointer = @fopen($Datei, "w"); // Filepointer setzen und Datei öffnen im "Write Modus"("w")

     If(!$FilePointer) $Error = True; // FilePointer auf Gültigkeit prüfen
     If(!@flock($FilePointer, 2)) $Error = True; // Wir holen uns eine exklusive, nur schreibende Verriegelung
     If(!@fwrite($FilePointer, $Daten)) $Error = True; // Wir schreiben in die Datei die Daten
     If(!@flock($FilePointer, 3)) $Error = True; // Wir geben unsere Verriegelung wieder frei
     If(!@fclose($FilePointer)) $Error = True; // Wir schließen die Datei wieder
   }
 Return !$Error;
}

So nun haben wir auch schon die Funktion fertig, um in eine Datei zu schreiben.
Da ja nun nicht umbedingt jeder Zugriff auf dieses Scriopt haben soll, bauen wir nun noch einen Passwortschutz ein. Wir basteln uns nun erstmal eine Funktion um die Gültigkeit des Logins zu ermitteln:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//Benutzer Setzen
$Users[0] = "Testperson"; // Nehmen hierzu ein Array, falls jemand mehrere Benutzer anlegen möchte.
$Pws[0] = "123"; //Besser wäre hier natürlich ein Hash Wert(Am einfachsten mit md5();)

Function is_login($User, $Password){
  Global $Users, $Pws;
  For($I = 0; $I <= (Count($Users)-1); $I++){
    If(($User == $Users[$I]) && ($Password == $Pws[$I])) { $Login = True; Break; } Else { $Login = False; }
  }
  Return $Login;
}
// Diese Variante von Christian S. ist eleganter als die obere, macht aber im Grunde das Selbe, nur das wahrscheinlich etwas schneller ;)
Function is_login($User, $Password){     
  Global $Users, $Pws;     
  Return ((($I = array_search($User, $Users)) !== False) && ($Pws[$I] == $Password));
}

So nun sieht der code schon so aus:
ausblenden volle Höhe Quelltext
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:
<?php
//Datei
$File = getcwd()."/code.txt"; // Datei liegt immer im selben verzeichnis wie das PHP-Skript.

//Benutzer Setzen

$Users[0] = "Testperson"; // Nehmen hierzu ein Array, falls jemand mehrere Benutzer anlegen möchte.
$Pws[0] = "123"; //Besser wäre hier natürlich ein Hash Wert(Am einfachsten mit md5();)

//POST Daten ermitteln und in eine Variable speichern
$MyData[0] = $_POST["code"]; // Mit $_POST fragt man die Post-Daten ab.
$MyData[1] = $_POST["user"]; // Diese Zeile muss ergänzt werden, wegen unserer Benutzerabfrage.
$MyData[2] = $_POST["pw"]; // Diese Zeile muss ergänzt werden, wegen unserer Benutzerabfrage.

Function is_login($User, $Password){     
  Global $Users, $Pws;     
  Return ((($I = array_search($User, $Users)) !== False) && ($Pws[$I] == $Password));
}

Function write($Datei, $Daten, $User, $Pw){// Diese Zeile muss ergänzt werden, wegen unserer Benutzerabfrage.
 $Error = False; //Unsere ErrorVariable :)
  If(is_login($User, $Pw)){
   If (!is_file($Datei)){ // Wenn die Datei nicht exisitiert -> erstellen
       $FilePointer = @fopen($Datei, "w+");
       @fclose($FilePointer);
       @chmod($Datei, 0777);
   }
   If(!is_writeable($Datei)){ // Wenn die Datei nicht schreibbar -> schreibbar machen
      If(!@chmod($Datei, 0777)){
        $Error = True;
      }
   }
   If(!$Error){
     $FilePointer = @fopen($Datei, "w"); // Filepointer setzen und Datei öffnen im "Write Modus"("w")

     If(!$FilePointer) $Error = True; // FilePointer auf Gültigkeit prüfen
     If(!@flock($FilePointer, 2)) $Error = True; // Wir holen uns eine exklusive, nur schreibende Verriegelung
     If(!@fwrite($FilePointer, $Daten)) $Error = True; // Wir schreiben in die Datei die Daten
     If(!@flock($FilePointer, 3)) $Error = True; // Wir geben unsere Verriegelung wieder frei
     If(!@fclose($FilePointer)) $Error = True; // Wir schließen die Datei wieder
   }
  }Else{// Diese Zeile muss ergänzt werden, wegen unserer Benutzerabfrage.
     $Error = True; // Fehlervariable zurückgeben, für eventuelles Fehlerhandling. Diese Zeile muss ergänzt werden, wegen unserer Benutzerabfrage.
   }// Diese Zeile muss ergänzt werden, wegen unserer Benutzerabfrage.
 Return !$Error;
}

Nun fehlt nur noch eine Read-Funktion, Ausgabe-Funktion und eine Switch-Anweisung, um die verschiedenen Funktionen zu verwalten.
ausblenden volle Höhe Quelltext
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:
Function read($Datei, &$Content){
$Error = False;
 If(file_exists($Datei)){
   If(!is_readable($Datei)){
     If(!@chmod($Datei, 0777)){
       $Error = True;
    }
   }
   $FilePointer = @fopen($Datei, "r"); // Filepointer setzen und Datei öffnen im "Read Modus"("r")
   $Buffer = filesize($Datei); // Wir speichern die gesammte größe der Datei in einer Variable
   If(!$FilePointer) $Error = True;
   If(!@flock($FilePointer, 1)) $Error = True; // Wir holen uns eine exklusive, nur lesende Verriegelung
   If($Buffer > 0){
     $Content = @fread($FilePointer, $Buffer); // Wir lesen die ganze Datei aus und speichern die gelesenen Daten in einer Variable
   }Else{
      $Content = "";
    }
   If(!@flock($FilePointer, 3)) $Error = True; // Wir geben unsere Verriegelung wieder frei
   If(!@fclose($FilePointer)) $Error = True; // Wir schließen die Datei
 }Else{
   $Error = True; // Bei Fehler false zurückgeben für eventuelles Fehlerhandling
  }
 Return !$Error;
}

Function show(){
  Global $File; // Variable für Funktion zugänglich machen
  If(!read($File, $Code)){  // Beispiel für ein Fehlerhandling
    die("Fehler beim Lesen der Datei!");
  }  
  Echo $Code; // Inhalt von $code ausgeben
}

if(!isset($_POST["mode"])) $_POST["mode"]=""; // Wenn "mode" nicht gesetzt dann default nehmen
switch($_POST["mode"]){ // Modi unterscheiden, ob Delphi Programm Daten sendet, oder nur ein User mit dem Browser die page besucht.
      default:
              show();
      break;

      case "write":
              If( !write($File, $MyData[0], $MyData[1], $MyData[2]) ) die("Fehler beim Schreiben der Datei!"); 
      break;
}

So, nun ist unser PHP-Skript fertig und im ganzen sieht es so aus:
ausblenden volle Höhe Quelltext
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:
<?php
$File = getcwd()."/code.txt";

$Users[0] = "Testperson";
$Pws[0] = "123";

$MyData[0] = $_POST["code"];
$MyData[1] = $_POST["user"];
$MyData[2] = $_POST["pw"];

Function is_login($User, $Password){     
  Global $Users, $Pws;     
  Return ((($I = array_search($User, $Users)) !== False) && ($Pws[$I] == $Password));
}

Function write($Datei, $Daten, $User, $Pw){
 $Error = False;
  If(is_login($User, $Pw)){
   If (!is_file($Datei)){
       $FilePointer = @fopen($Datei, "w+");
       @fclose($FilePointer);
       @chmod($Datei, 0777);
   }
   If(!is_writeable($Datei)){
      If(!@chmod($Datei, 0777)){
        $Error = True;
      }
   }
   If(!$Error){
     $FilePointer = @fopen($Datei, "w");

     If(!$FilePointer) $Error = True;
     If(!@flock($FilePointer, 2)) $Error = True;
     If(!@fwrite($FilePointer, $Daten)) $Error = True;
     If(!@flock($FilePointer, 3)) $Error = True;
     If(!@fclose($FilePointer)) $Error = True;
   }
  }Else{
     $Error = True;
   }
 Return !$Error;
}

Function read($Datei, &$Content){
$Error = False;
 If(file_exists($Datei)){
   If(!is_readable($Datei)){
     If(!@chmod($Datei, 0777)){
       $Error = True;
    }
   }
   $FilePointer = @fopen($Datei, "r");
   $Buffer = filesize($Datei);
   If(!$FilePointer) $Error = True;
   If(!@flock($FilePointer, 1)) $Error = True;
   If($Buffer > 0){
     $Content = @fread($FilePointer, $Buffer);
   }Else{
      $Content = "";
    }
   If(!@flock($FilePointer, 3)) $Error = True;
   If(!@fclose($FilePointer)) $Error = True;
 }Else{
   $Error = True;
  }
 Return !$Error;
}

Function show(){
  Global $File;
  If(!read($File, $Code)){
    die("Fehler beim Lesen der Datei!");
  }  
  Echo $Code;
}

If(!Isset($_POST["mode"])) $_POST["mode"] = "";
Switch($_POST["mode"]){
      Default:
              show();
      Break;

      Case "write":
              If( !write($File, $MyData[0], $MyData[1], $MyData[2]) ) die("Fehler beim Schreiben der Datei!"); 
      Break;
}
?>


Kommen wir nun zu unserem Delphi Programm:
Wir starten ein neues Programm und setzen auf die Form ein TIdHTTP. Dann brauchen wir noch 2 TEdits, für den Login, und 1 TMemo für den Inhalt den wir auf den Server bringen wollen :). Wenn das geschafft ist, setzen wir noch einen Button auf die Form und schreiben ins OnClick:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TSubmitForm.Button1Click(Sender: TObject);
var Strings: TStringList;
begin
  Strings := TStringList.Create;
  Button1.Enabled := False;
  try
    Strings.Add('mode=write');
    Strings.Add('user='+Edit1.Text);
    Strings.Add('pw='+Edit2.Text);
    Strings.Add('code='+Memo1.Lines.Text);
    try
      HTTP.Post('http://www.deinhost.de/interface.php', Strings);
    except
     on E: Exception do
       showmessage('Error encountered during POST: ' + E.Message);
    end;
  finally
    Strings.Free;
  end;
  Button1.Enabled := True;
end;


So und im Großen und Ganzen wars das auch schon :P . Ich hoffe ich kann euch hiermit helfen. Es ist mein erstes Tutorial und wenn ihr Fehler findet meldet sie mir bitte direkt.

mfg matze

!!Wichtig: Auf vielen Webservern lassen sich Dateien nicht per PHP-Skript erstellen, daher ist es besser ihr ladet die *.txt Datei vorher auf den Server und gebt ihr den CHMOD 777!!


P.S.:Das "@" Unterdrückt die Fehlerausgabe, falls ein Fehler auftritt.
//Edit: Paar Bugfixes
//Edit2: LoginFix + 2 Varianten
//Edit3: Return $Error in Return !$Error geändert, da funktionen wenn sie nciht funktioniert haben ja False und nicht True zurückgeben! :)

_________________
si tacuisses, philosophus mansisses.


Zuletzt bearbeitet von matze.de am Do 15.06.06 09:30, insgesamt 15-mal bearbeitet
WeBsPaCe
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2322
Erhaltene Danke: 1

FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
BeitragVerfasst: Fr 10.06.05 19:16 
user profile iconmatze.de hat folgendes geschrieben:
ausblenden Quelltext
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:
<?php
//Datei
$file = getcwd().'/code.txt'; // Datei liegt immer im selben verzeichnis wie das PHP-Skript.

//POST Daten ermitteln und in eine Variable speichern
$MyData[0] = $_REQUEST['code']; // Mit $_REQUEST fragt man die Post-Daten ab.

function write($Datei, $Daten, $User, $Pw){
$Error=false; //Unsere ErrorVariable :)
// Wenn die Datei nicht exisitiert -> erstellen
if (!is_file(Datei))
{
    $FilePointer=@fopen($Datei, 'w+');
    @fclose($FilePointer);
    @chmod(Datei, 0777);
}

$FilePointer=@fopen(Datei, 'w'); // Filepointer setzen und Datei im "Write Modus"("w") öffnen

if (!$FilePointer) $Error=true; // FilePointer auf Gültigkeit prüfen
if (!@flock($FilePointer, 2)) $Error=true; // Wir holen uns eine exklusive, nur schreibende Verriegelung
if (!@fwrite($FilePointer, $Daten)) $Error=true; // Wir schreiben in die Datei die Daten
if (!@flock($FilePointer, 3)) $Error=true; // Wir geben unsere Verriegelung wieder frei
if (!@fclose($FilePointer)) $Error=true; // Wir schließen die Datei wieder
return $Error // Fehlervariable zurückgeben, für eventuelles Fehlerhandling
}


Wieso diese IF-Abfrage da? Laut PHP-Referenz reicht ein w+ beim fopen zum erstellen. Also wieso nochmal eine Abfrage? :gruebel:


PS.:
Bin noch nicht ganz durch. Werd später (nachm Essen) weiterlesen... ;)
matze.de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: Fr 10.06.05 19:27 
user profile iconWeBsPaCe hat folgendes geschrieben:
user profile iconmatze.de hat folgendes geschrieben:
ausblenden Quelltext
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:
<?php
//Datei
$file = getcwd().'/code.txt'; // Datei liegt immer im selben verzeichnis wie das PHP-Skript.

//POST Daten ermitteln und in eine Variable speichern
$MyData[0] = $_REQUEST['code']; // Mit $_REQUEST fragt man die Post-Daten ab.

function write($Datei, $Daten, $User, $Pw){
$Error=false; //Unsere ErrorVariable :)
// Wenn die Datei nicht exisitiert -> erstellen
if (!is_file(Datei))
{
    $FilePointer=@fopen($Datei, 'w+');
    @fclose($FilePointer);
    @chmod(Datei, 0777);
}

$FilePointer=@fopen(Datei, 'w'); // Filepointer setzen und Datei im "Write Modus"("w") öffnen

if (!$FilePointer) $Error=true; // FilePointer auf Gültigkeit prüfen
if (!@flock($FilePointer, 2)) $Error=true; // Wir holen uns eine exklusive, nur schreibende Verriegelung
if (!@fwrite($FilePointer, $Daten)) $Error=true; // Wir schreiben in die Datei die Daten
if (!@flock($FilePointer, 3)) $Error=true; // Wir geben unsere Verriegelung wieder frei
if (!@fclose($FilePointer)) $Error=true; // Wir schließen die Datei wieder
return $Error // Fehlervariable zurückgeben, für eventuelles Fehlerhandling
}


Wieso diese IF-Abfrage da? Laut PHP-Referenz reicht ein w+ beim fopen zum erstellen. Also wieso nochmal eine Abfrage? :gruebel:


PS.:
Bin noch nicht ganz durch. Werd später (nachm Essen) weiterlesen... ;)


Hab ich gemacht um den CHMOD direkt einzustellen.

mfg matze

_________________
si tacuisses, philosophus mansisses.
WeBsPaCe
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2322
Erhaltene Danke: 1

FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
BeitragVerfasst: Fr 10.06.05 20:03 
Muss ich das jetzt verstehen? CHMOD weißt Zugriffsrechte zu. Mit is_file überprüfst du doch nicht, ob du schreiben kannst. Oder wie?
matze.de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: Fr 10.06.05 20:05 
Ja, ist eigentlich egal, außer, dass das Script so nicht ständig den CHMOD ausführt.

mfg matze

_________________
si tacuisses, philosophus mansisses.
WeBsPaCe
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2322
Erhaltene Danke: 1

FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
BeitragVerfasst: Fr 10.06.05 20:26 
Bin jetzt durch. ;) Ich hab keine "Fehler" gefunden. Verständlich ist auch alles.

Nur vielleicht ein kleiner Kommentar. Und zwar die Sicherheit eines solchen Skripts betreffend. ;) Wenn irgendjemand dein Delphi-Programm so nimmt, wie's grad ist benutzt, dann wird das Passwort und der dazugehörige Username als Plain/Text gesendet. Heißt "im Klartext". Jeder, der z.B. mit ethereal rumsnifft fängt das dann auf. Ziemlich unpraktisch. Deshalb entweder dieses Skript nicht für "wichtige" Sachen benutzen. Obwohl Dateien speichern ja wohl immer was wichtiges ist. Grad wenn das dann "jeder" machen kann. Lösung wäre wie schon angesprochen nur Hash-Werte zu senden und auch solche als "Parameter" zu erwarten. ;)

Ansonsten wirklich gutes Tut. ;)
matze.de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: Sa 11.06.05 13:10 
Joa in Hinsicht auf Sicherheit kann man da schon noch bischen was machen, aber dieses tutorial sollte ja nur eine Basis darstellen. Erweitern kann dies jeder wie er will. :)

mfg matze

_________________
si tacuisses, philosophus mansisses.
Hannes Peter
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 20.07.05 12:22 
Ich kann zwar kein PHP,

sehe aber einige Flüchtigkeitsfehler in der syntax.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function write($Datei, $Daten, $User, $Pw){
if(is_login($User, $Pw)){
 $Error=false;
 if (!is_file(Datei))
 {
     $FilePointer=@fopen($Datei, 'w+');
     @fclose($FilePointer);
     @chmod(Datei, 0777);
 }
 $FilePointer=@fopen(Datei, 'w');
 
 if (!$FilePointer) $Error=true;
 if (!@flock($FilePointer, 2)) $Error=true;
 if (!@fwrite($FilePointer, $Daten)) $Error=true;
 if (!@flock($FilePointer, 3)) $Error=true;
 if (!@fclose($FilePointer)) $Error=true;
 return $Error
 }[highlight]
}

Sollte in
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function write($Datei, $Daten, $User, $Pw){
if(is_login($User, $Pw)){
 $Error=false;
 if (!is_file($Datei)){<----- Änderung}
 {
     $FilePointer=@fopen($Datei, 'w+');
     @fclose($FilePointer);
     @chmod($Datei, 0777);{<----- Änderung}
 }
 $FilePointer=@fopen(Datei, 'w');
 
 if (!$FilePointer) $Error=true;
 if (!@flock($FilePointer, 2)) $Error=true;
 if (!@fwrite($FilePointer, $Daten)) $Error=true;
 if (!@flock($FilePointer, 3)) $Error=true;
 if (!@fclose($FilePointer)) $Error=true;
 return $Error; {<----- Änderung}
 }{<----- Änderung}
}

geändert werden.
matze.de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: Mi 20.07.05 13:02 
Habs geändert, danke.

mfg matze

_________________
si tacuisses, philosophus mansisses.
wolle-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128

XP Prof, Suse 9.2
D7
BeitragVerfasst: Mi 20.07.05 22:21 
Bei mir gehtsnicht :/

ausblenden volle Höhe Delphi-Quelltext
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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XPMenu, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    HTTP: TIdHTTP;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    XPMenu1: TXPMenu;
    Memo1: TMemo;
    WebBrowser1: TWebBrowser;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Strings: TStringList;
begin
  Strings := TStringList.Create;
  Button1.Enabled := False;
  try
    Strings.Add('mode=write');
    Strings.Add('user='+Edit1.Text);
    Strings.Add('pw='+Edit2.Text);
    Strings.Add('code='+Memo1.Lines.Text);
    try
      HTTP.Post('http://meinhost/interface.php', Strings);
    except
     on E: Exception do
       showmessage('Error encountered during POST: ' + E.Message);
    end;
  finally
    Strings.Free;
  end;
  Button1.Enabled := True;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Webbrowser1.Navigate('http://Meinhost.de/interface.php');
end;

end.



und der PHP code:


ausblenden volle Höhe Quelltext
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:
<?php  
$file = getcwd().'/code.txt';  

 
$users[0] = 'test';  
$pws[0] = 'test';  

 
$MyData[0] = $_REQUEST['code'];  
$MyData[1] = $_REQUEST['user'];  
$MyData[2] = $_REQUEST['pwd'];  

 
function is_login($User, $Password){  
  global $users, $pws;  
  if((in_array($User, $users)) AND (in_array($Password, $pws))) { Return true; } else { Return false; }  
}  

function write($Datei, $Daten, $User, $Pw){  
if(is_login($User, $Pw)){  
 $Error=false;  
 if (!is_file($Datei))
 {  
     $FilePointer=fopen($Datei, 'w+');  
     fclose($FilePointer);  
     chmod($Datei, 0777);
 }  
 $FilePointer=fopen(Datei, 'w');  
   
 if (!$FilePointer) $Error=true;  
 if (!flock($FilePointer, 2)) $Error=true;  
 if (!fwrite($FilePointer, $Daten)) $Error=true;  
 if (!flock($FilePointer, 3)) $Error=true;  
 if (!fclose($FilePointer)) $Error=true;  
 return $Error;
 }

 
function read($file, &$content){  
$Error = false;  
 if(file_exists($file)){  
   $filepointer = fopen($file, "r");  
   $buffer = filesize($file);  
   if(!$filepointer) $Error = true;  
   if (!flock($FilePointer, 1)) $Error=true;  
   $content = fread($filepointer, $buffer);  
   if (!flock($FilePointer, 3)) $Error=true;  
   if(!fclose($filepointer)) $Error = true;  
 }else{  
   $Error = true;  
  }  
 Return $Error;  
}  

 
function show(){  
  global $file;  
  read($file, $code);  
  echo $code;  
}  

 
if(!isset($_REQUEST['mode'])) $_REQUEST['mode']='';  
switch($_REQUEST['mode']){  
      default:  
              show();  
      break;  

 
      case 'write':  
              write($file, $MyData[0], $MyData[1], $MyData[2]);  
      break;  
}  
?>

_________________
Don`t eat yellow snow ;)!!
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 20.07.05 23:01 
"Bei mir gehts nicht" ist wieder so ne aussage... Beschreib mal, WAS nicht geht! Wenns nicht im PHP code stehn würde, würde ich sagen, es läge am CHMOD... Aber meine Kristallkugel hat letztens nen Sprung bekommen, als so n neuer unbedingt wissen wollte, warum StringTuInteger[xy] nicht klappt...

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
wolle-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128

XP Prof, Suse 9.2
D7
BeitragVerfasst: Do 21.07.05 11:07 
Sorry
der Delphi code funktioniert ich schreibe dann username und password in die Edits und ins Memo einen Text, die code.txt bleibt einfach leer und im Browser sagt er bei der php:

ausblenden Quelltext
1:
2:
3:
4:
5:
Warning: flock(): supplied argument is not a valid stream resource in /home/wolle/public_html/interface.php on line 45

Warning: fread(): Length parameter must be greater than 0. in /home/wolle/public_html/interface.php on line 46

Warning: flock(): supplied argument is not a valid stream resource in /home/wolle/public_html/interface.php on line 47


Was ich aber nicht verstehe
Daher hoffe ich deine Kristall Kugel ist wieder gefüllt :)

Danke
Wolle

_________________
Don`t eat yellow snow ;)!!
matze.de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: Do 21.07.05 14:45 
Ist der CHMOD auf 777 gesetzt bei der code.txt? Manche webserver unterstützen es nicht den CHMOD von nem PHP-Skript(Wie bei mir mit chmod();) ändern zu lassen....

mfg matze

_________________
si tacuisses, philosophus mansisses.
wolle-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128

XP Prof, Suse 9.2
D7
BeitragVerfasst: Do 21.07.05 15:04 
Jawoll dachte erst es liegt daran aber nein! Chmod 777

Ich hänge mal die php an und das delphi teil von mir auch :)!
Einloggen, um Attachments anzusehen!
_________________
Don`t eat yellow snow ;)!!
matze.de Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: Do 21.07.05 16:00 
@Wolle: Hab den Fehler gefunden... Sorry, mea culpa. Im PHP-Skript steht $MyData[2] = $_REQUEST["pwd"]; aber in Delphi wird es als "pw" gesendet also änder in deinem PHP-Skript:
ausblenden Quelltext
1:
2:
3:
$MyData[2] = $_REQUEST["pwd"];
IN
$MyData[2] = $_REQUEST["pw"];


mfg matze

P.S.: Das Tutorial hab ich ein wenig ergänzt und der Fehler ist schon behoben!

_________________
si tacuisses, philosophus mansisses.
wolle-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128

XP Prof, Suse 9.2
D7
BeitragVerfasst: Do 21.07.05 20:14 
ausblenden Quelltext
1:
2:
3:
4:
5:
Warning: flock(): supplied argument is not a valid stream resource in /home/wolle/public_html/interface.php on line 45

Warning: fread(): Length parameter must be greater than 0. in /home/wolle/public_html/interface.php on line 46

Warning: flock(): supplied argument is not a valid stream resource in /home/wolle/public_html/interface.php on line 47


erhalte ich immernoch

Dabei sieht die php so aus:

ausblenden volle Höhe Quelltext
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:
<?php  
$file = getcwd().'/code.txt';  

 
$users[0] = 'test';  
$pws[0] = 'test';  

 
$MyData[0] = $_REQUEST['code'];  
$MyData[1] = $_REQUEST['user'];  
$MyData[2] = $_REQUEST["pw"];  

 
function is_login($User, $Password){  
  global $users, $pws;  
  if((in_array($User, $users)) AND (in_array($Password, $pws))) { Return true; } else { Return false; }  
}  

function write($Datei, $Daten, $User, $Pw){  
if(is_login($User, $Pw)){  
 $Error=false;  
 if (!is_file($Datei))
 {  
     $FilePointer=fopen($Datei, 'w+');  
     fclose($FilePointer);  
     chmod($Datei, 0777);
 }  
 $FilePointer=fopen(Datei, 'w');  
   
 if (!$FilePointer) $Error=true;  
 if (!flock($FilePointer, 2)) $Error=true;  
 if (!fwrite($FilePointer, $Daten)) $Error=true;  
 if (!flock($FilePointer, 3)) $Error=true;  
 if (!fclose($FilePointer)) $Error=true;  
 return $Error;
 }

 
function read($file, &$content){  
$Error = false;  
 if(file_exists($file)){  
   $filepointer = fopen($file, "r");  
   $buffer = filesize($file);  
   if(!$filepointer) $Error = true;  
   if (!flock($FilePointer, 1)) $Error=true;  
   $content = fread($filepointer, $buffer);  
   if (!flock($FilePointer, 3)) $Error=true;  
   if(!fclose($filepointer)) $Error = true;  
 }else{  
   $Error = true;  
  }  
 Return $Error;  
}  

 
function show(){  
  global $file;  
  read($file, $code);  
  echo $code;  
}  

 
if(!isset($_REQUEST['mode'])) $_REQUEST['mode']='';  
switch($_REQUEST['mode']){  
      default:  
              show();  
      break;  

 
      case 'write':  
              write($file, $MyData[0], $MyData[1], $MyData[2]);  
      break;  
}  
?>

_________________
Don`t eat yellow snow ;)!!
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 21.07.05 23:55 
Ich hoffe doch, die code.txt existiert? :shock:
Fehler gefunden: Auf Linuxservern (fast alle Webserver sind solche) ist alles Casesensitive. => Schreibe FilePointer statt filepointer!!!
Zeilen 42-44:
ausblenden Quelltext
1:
2:
3:
4:
   $filepointer = fopen($file, "r");     
   $buffer = filesize($file);     
   if(!$filepointer) $Error = true;     
   if (!flock($FilePointer, 1)) $Error=true;

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
wolle-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128

XP Prof, Suse 9.2
D7
BeitragVerfasst: Fr 22.07.05 09:31 
Danke, die Code.txt existiert natürlich

bekomme nurnoch:

ausblenden Quelltext
1:
Warning: fread(): Length parameter must be greater than 0. in /home/wolle/public_html/interface.php on line 46					

_________________
Don`t eat yellow snow ;)!!
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 22.07.05 11:43 
Kein Problem, auch hier weis ich Abhilfe:
ausblenden Quelltext
1:
2:
3:
4:
   $buffer = filesize($file);     
   if(!$filepointer) $Error = true;     
   if (!flock($FilePointer, 1)) $Error=true;     
   $content = fread($filepointer, $buffer);

Die Variable $buffer wird mit der größe der Datei gefüllt. Die Datei ist aber neu erstellt worden, und desshalb LEER!!!!!
Besser:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
   $buffer = filesize($file);     
   if(!$filepointer) $Error = true;     
   if (!flock($FilePointer, 1)) $Error=true;
   if ($buffer>0){     
     $content = fread($filepointer, $buffer); 
   }else{
     $Error=true;
   }

Das sollte solche Probleme beheben.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
wolle-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128

XP Prof, Suse 9.2
D7
BeitragVerfasst: Fr 22.07.05 16:07 
Warum bin ich der einzigste mit den Fehlern? immer funktioniert bei mir was nicht...

Danke für deine Hilfe

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function read($file, &$content){  
$Error = false;  
 if(file_exists($file)){  
   $FilePointer = fopen($file, "r");  
$buffer = filesize($file);       
   if(!$filepointer) $Error = true;       
   if (!flock($FilePointer, 1)) $Error=true;  
   if ($buffer>0){       
     $content = fread($filepointer, $buffer);   
   }else{  
     $Error=true;  
   }


ausblenden Quelltext
1:
Parse error: parse error, unexpected $ in /home/wolle/public_html/interface.php on line 72					


?????

_________________
Don`t eat yellow snow ;)!!