Entwickler-Ecke

Delphi Tutorials - Daten an PHP-Webserver senden, mittels HTTP-POST


matze.de - Fr 10.06.05 18:53
Titel: Daten an PHP-Webserver senden, mittels HTTP-POST
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:

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:

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:

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:

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.

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:

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:

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! :)


WeBsPaCe - Fr 10.06.05 19:16

user profile iconmatze.de hat folgendes geschrieben:

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 [http://www.php.net/fopen] 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 - Fr 10.06.05 19:27

user profile iconWeBsPaCe hat folgendes geschrieben:
user profile iconmatze.de hat folgendes geschrieben:

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 [http://www.php.net/fopen] 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


WeBsPaCe - 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 - 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


WeBsPaCe - 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 - 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


Hannes Peter - Mi 20.07.05 12:22

Ich kann zwar kein PHP,

sehe aber einige Flüchtigkeitsfehler in der syntax.


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

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 - Mi 20.07.05 13:02

Habs geändert, danke.

mfg matze


wolle- - Mi 20.07.05 22:21

Bei mir gehtsnicht :/


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:



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;  
}  
?>


JayEff - 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- - 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:


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


matze.de - 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


wolle- - 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 :)!


matze.de - 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:

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!


wolle- - Do 21.07.05 20:14


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:


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;  
}  
?>


JayEff - 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:

Quelltext
1:
2:
3:
4:
   $filepointer = fopen($file, "r");     
   $buffer = filesize($file);     
   if(!$filepointer) $Error = true;     
   if (!flock($FilePointer, 1)) $Error=true;


wolle- - Fr 22.07.05 09:31

Danke, die Code.txt existiert natürlich

bekomme nurnoch:


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


JayEff - Fr 22.07.05 11:43

Kein Problem, auch hier weis ich Abhilfe:

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:

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- - 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


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;  
   }



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


?????


JayEff - Fr 22.07.05 16:34

Den ganzen code. sonst weis ich nicht, wo line 72 ist.
edit: gefunden.
function read($file, &$content){Lern mal PHP Syntax... (*empfehl* ^^) was hat das & zeichen da zu suchen?


wolle- - Fr 22.07.05 18:06


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:
<?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;  
   if ($buffer>0){       
     $content = fread($filepointer, $buffer);   
   }else{  
     $Error=true;  
   } 

 
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;  
}  
?>


sagt immernoch $ unexeptet


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:
<?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;  
   if ($buffer>0){       
     $content = fread($filepointer, $buffer);   
   }else{  
     $Error=true;  
   } 

 
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;  
}  
?>


matze.de - Fr 22.07.05 19:02

user profile iconJayEff hat folgendes geschrieben:
Den ganzen code. sonst weis ich nicht, wo line 72 ist.
edit: gefunden.
function read($file, &$content){Lern mal PHP Syntax... (*empfehl* ^^) was hat das & zeichen da zu suchen?


JeyEff lern du erstmal PHP: Das & Zeichen ist dafür da um die Variable als Referenz anzugeben.

mfg matze


wolle- - Fr 22.07.05 19:36

funzt trotzdem nicht :-)


JayEff - Fr 22.07.05 19:37

Ich KANN PHP. Ich kannte nur das & nicht. Und ich habe meine Aussage nicht auf das & bezogen, sondern allgemein. UND Ausserdem gibt es auf der ganzen selfPHP Seite das & zeichen nicht. (jedenfalls laut suche) Darum habe ich das auch gesagt.

Zum Thema zurück: Dein code hat nur 71 Zeilen :shock: wie kann da in Zeile 72 ein Fehler sein?


wolle- - Fr 22.07.05 19:58

Gute frage?!


ice-breaker - Fr 22.07.05 21:32

ich wollte nurmal anmerken, dass für Post-Request die superglobale variable (bzw. array) $_POST genutzt wird, und nicht $_REQUEST, denn $_REQUEST umfasst POST- und GET-Variablen :wink:


wolle- - Fr 22.07.05 23:19

Heisst das ich soll $_Request durch $_Post ausgetauscht werden?


JayEff - Sa 23.07.05 00:30

Was Allgemeines:

Quelltext
1:
2:
3:
4:
function is_login($User, $Password){     
  global $users, $pws;     
  if((in_array($User, $users)) AND (in_array($Password, $pws))) { Return true; } else { Return false; }     
}

Was ist nun, wenn ich ein Passowrt, das in der Liste ist eingebe, und einen völlig anderen User, der auch in der liste ist? Bsp:

Quelltext
1:
2:
3:
4:
Users:  pws:
user1   1
user2   2
user3   3

Und ich gebe ein user1 passwort "3"
Werde ich dann nicht unkorrekterweise eingelassen?


wolle- - Sa 23.07.05 00:51

Weshalb solltest du das, ich denke nicht das es so ist


JayEff - Sa 23.07.05 00:54

Ich vermute nicht, dass in_array mit einem AND verknüpft beide male den gleichen index aufruft, um zu prüfen. ich denke das ist mehr wie wenn ich 2 texte nach wörtern durchsuche und nicht darauf achte, wo sie stehen, sondern nur, ob sie drin sind.
selfPHP.de hat folgendes geschrieben:
Die Funktion in_array() sucht in einem Array (haystack) nach einem Suchwort
(needle) und gibt True bei Erfolg, sonst False zurück. Hat der Parameter strict
den Wert True, sucht die Funktion nur Elemente, deren Wert denselben Datentyp
hat wie needle; Default-Wert ist False. Bitte beachten Sie, dass wenn der Wert
von needle vom Typ String ist, zwischen Groß- und Kleinschreibung unterschieden
wird (Sie Beispiel PERL und Perl). Weiterhin durfte vor der Version 4.2.0 von
PHP needle kein Array sein. Falls Sie den Schlüssel des gefundenen Elements
benötigen, so nutzen Sie die Funktion array_search()


wolle- - Sa 23.07.05 01:05

warum meins dann nicht funktioniert weiss ich auch nicht o.O


matze.de - Sa 23.07.05 11:54

@JayEff: War nicht angreifend gemeint, ich weiß auch noch ne Menge in PHP ned, wenns so rübergekommen ist, dann sorry. Wegen Referenz:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
<?php
//Ohne ReferenzVariable
function addier($Zahl1, $Zahl2){
  Return ($Zahl1 + $Zahl2);
}
//Aufruf:
$Bla = addier(5, 3);
echo $Bla; //Ausgabe "8"

//Mit ReferenzVariable
function addier($Zahl1, $Zahl2, &$Ergebnis){
  $Ergebnis = $Zahl1 + $Zahl2;
}
//Aufruf
addier(5, 3, $Bla);
echo $Bla; // Ausgabe: "8"
?>


@Login: Danke für den Hinweis, hab nun nen gefixten Login geupdatet.

@Wolle: Schildere bitte nochmal expliziet dein Problem, aber probier vorher nochmal den neuen Source aus meinem Tutorial aus.

mfg matze


Christian S. - Sa 23.07.05 12:33

Hallo!

Das mit dem Login sollte eleganter mittels

Quelltext
1:
2:
3:
4:
5:
function is_login($User, $Password){     
  global $users, $pws;     

  return ((($i = array_search($User, $users)) !== FALSE) && ($pws[$i] == $Password));
}

gehen.

Grüße
Christian

//Edit:
user profile iconwolle- hat folgendes geschrieben:

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

Für solche Fälle kann man auch in Code-Tags eienn offset in die Zeilennummern einbauen. Einfach mal in der Hilfe [http://www.delphi-forum.de/sites.php?id=40&sub=,19,27,32] gucken! :-)


wolle- - Sa 23.07.05 12:58

Danke nun funktioniert das, aber eine frage noch
wenn ich einmal was hochschicke ist es drin, wenn ich was neues hochschicke killt der das alte vorher!

Kann man das machen, das der das darunter setzt?

Vielen Dank

mfg wolle


matze.de - Sa 23.07.05 13:07

Ja kann man, du änderst einfach bei der write funktion

Quelltext
1:
2:
3:
4:
   If(!$Error){
     $FilePointer = @fopen($Datei, "w");

     If(!$FilePointer) $Error = True;

das "w" in "a" um :) (w steht für "Write" und a für "Append")

mfg matze


wolle- - Sa 23.07.05 13:28

danke :D Das ist ja super, nun versuche ich mal das als html zum anzeigen geformt zu bekommen, eine einzigste frage noch
wenn ich etwas in die selbe zeile schreibe soll er vorher ein #10#13 machen also neue zeile muss das in die reihe?

->

Delphi-Quelltext
1:
2:
3:
try
      HTTP.Post('http://meinhost.de/interface.php',#10#13 + Strings);
    except


das funzt nähmlich nicht :D


JayEff - Sa 23.07.05 15:42

Ich verstehe nicht ganz was du willst :shock: (Übrigens ist "einzigen" schon superlativ, es gibt keine weitere Steigerung "einzigsten" ;))
Das mit dem Offset wusste ich, war aber immer zu faul zum

Quelltext
 
50:
{ ... }
Nachschauen

Ach und nochwas: Mein "Lern erstmal PHP Syntax" bezog sich auf wolle. Hätte ich gesehen, dass das & auch bei dir steht, hätte ich das Mowl gehalten. :oops:


wolle- - Sa 23.07.05 15:57

Na der schreibt alles hintereinander:

Ich gebe text ein:
Hallo
-Absenden-

Ich gebe erneut text ein:
Byebye
-Absenden-

Dann steht es in der datei so:
HalloByebye

Aber ich wollte irgendwie so:
Hallo
Byebye

Geht sowas? Dachte mit #10#13 oder so :/

Moderiert von user profile iconChristian S.: Highlight-Tags entfernt, sonst müssen wir Sonnenbrillen verteilen ;-)


JayEff - Sa 23.07.05 16:04

Schau: guck dir http://www.selfPHP.de an.
Funktionsreferenz von selfPHP [http://www.selfphp.de/funktionsreferenz/dateisystem_funktionen/fopen.php]:
Mit fopen() kann man eine Datei (filename) öffnen. Folgende
Verbindungsmöglichkeiten gibt es:
"http://" - Öffnen per http
"ftp://" - Öffnen per ftp
"php://stdin" - Öffnen per stdio stream
"php://stdout" - Öffnen per stdio stream
"php://stderr" - Öffnen per stdio stream
Alles andere - Öffnen vom lokalen Dateisystem
Der Parameter mode legt fest, auf welche Weise und für welche Zugriffsarten die
Datei geöffnet wird. Folgende Werte gibt es:
a - Öffnet die angegebene Datei nur zum Schreiben und positioniert den
Dateizeiger auf das Ende der Datei. Sollte die angegebene Datei nicht existieren,
so wird versucht sie anzulegen.
a+ - Öffnet die angegebene Datei zum Lesen und Schreiben und positioniert den
Dateizeiger auf das Ende der Datei. Sollte die angegebene Datei nicht existieren,
so wird versucht sie anzulegen.
r - Öffnet die angegebene Datei zum Lesen und positioniert den Dateizeiger auf
den Anfang der Datei.
r+ - Öffnet die angegebene Datei zum Lesen und Schreiben und positioniert den
Dateizeiger auf den Anfang der Datei.
w - Öffnet die angegebene Datei zum Schreiben und positioniert den Dateizeiger
auf den Anfang der Datei. Die Länge der Datei wird auf 0 Byte gesetzt. Sollte die
angegebene Datei nicht existieren, so wird versucht sie anzulegen.
w+ - Öffnet die angegebene Datei zum Lesen und Schreiben und positioniert den
Dateizeiger auf den Anfang der Datei. Sollte die angegebene Datei nicht
existieren, so wird versucht sie anzulegen.

Für die Bearbeitung von Binärdateien können Sie an jede dieser
Modusdefinitionen ein "b" anhängen.
Wird der optionale Parameter use_include_path auf 1 gesetzt, so wird auch
innerhalb des Include-Pfads (wird in der php.ini bestimmt) nach der Datei
gesucht.

Im Erfolgsfall gibt die Funktion einen Dateizeiger zurück. Sollte das Öffnen der
Datei scheitern, so wird false zurückgeliefert.

Du siehst? Dadurch, dass die datei mit w geöffnet wird, wird sie gelöscht. Öffne sie mit r+ und du schreibst an den Anfang der Datei. Öffne sie mit a+ und du schreibst an ihr Ende. Neue zeilen bekommst du (logischerweise) mit <br> und NICHT mit #10#13, da soetwas vom Browser nicht als newline interpretiert wird. In der Datei ist dann vielleicht eine neue Zeile. Aber das bringt dir ja nix. Des weiteren läuft auf den allermeisten Webserverern Linux und hier ist das newline Zeichen soweit ich weis kein 2byte Zeichen sondern nur #10 oder #13 ...


ice-breaker - Sa 23.07.05 17:03

user profile iconwolle- hat folgendes geschrieben:
Heisst das ich soll $_Request durch $_Post ausgetauscht werden?

jaa, das weiß ich 100% ich progge sehr sehr viel PHP
ich würde auch dne Tutorial-Schreiber bitten das zu bearbeiten

zu der frage mit in_array() [http://de.php.net/manual/de/function.in-array.php], in_array() stellt nur fest ob sich der WERT in dem array befindet. Ich weiß nicht wie Delphi das sendet wenn man nix eingibt, aber nach den RFC's sollte es das mit einem LEEREN Wert senden, was nun mit empty() [http://de.php.net/manual/de/function.empty.php] geprüft werden kann


matze.de - Sa 23.07.05 17:38

user profile iconice-breaker hat folgendes geschrieben:
ich würde auch dne Tutorial-Schreiber bitten das zu bearbeiten


Ist schon total lange korrigiert... erst gucken dann labern!

mfg matze


Christian S. - Sa 23.07.05 17:39

@matze.de: Nicht so aggressiv :mahn:


ice-breaker - Sa 23.07.05 17:45

user profile iconmatze.de hat folgendes geschrieben:
user profile iconice-breaker hat folgendes geschrieben:
ich würde auch dne Tutorial-Schreiber bitten das zu bearbeiten


Ist schon total lange korrigiert... erst gucken dann labern!

mfg matze
sorry sorry, net so agressiv
mein browser hat das wohl ausm cahce geladen, weil jetzt sehe ich es erst geändert


matze.de - Sa 23.07.05 17:46

user profile iconice-breaker hat folgendes geschrieben:
user profile iconmatze.de hat folgendes geschrieben:
user profile iconice-breaker hat folgendes geschrieben:
ich würde auch dne Tutorial-Schreiber bitten das zu bearbeiten


Ist schon total lange korrigiert... erst gucken dann labern!

mfg matze
sorry sorry, net so agressiv
mein browser hat das wohl ausm cahce geladen, weil jetzt sehe ich es erst geändert


Ja, Sorry. Habter mich an nem falschen Tag erwischt :\

mfg matze


wolle- - Sa 23.07.05 17:57

Also soll ich da nun überall #13 hinterschreiben oder #10?


matze.de - Sa 23.07.05 18:01

Nein du schreibst ein <br> oder ein <p> hin.
Bei <p> haste aber nen großen Zeilenabstand, also nimm <br> :)

mfg matze


ice-breaker - Sa 23.07.05 18:13

user profile iconmatze.de hat folgendes geschrieben:
Nein du schreibst ein <br> oder ein <p> hin.
Bei <p> haste aber nen großen Zeilenabstand, also nimm <br> :)

mfg matze

hmm, also wenn es in ne text-datei geschrieben wird, warum dann ein <br> ?
da wäre ein \n doch sehr viel sinnvoller, oder speichert er als html?


wolle- - Sa 23.07.05 18:42

genau das ging mir auch durch den kopf deswegn habe ich es nun als php gemacht bin mal gespannt ob es dann geht...

war natürlich eine txt


matze.de - Sa 23.07.05 19:25

user profile iconice-breaker hat folgendes geschrieben:
user profile iconmatze.de hat folgendes geschrieben:
Nein du schreibst ein <br> oder ein <p> hin.
Bei <p> haste aber nen großen Zeilenabstand, also nimm <br> :)

mfg matze

hmm, also wenn es in ne text-datei geschrieben wird, warum dann ein <br> ?
da wäre ein \n doch sehr viel sinnvoller, oder speichert er als html?


Das was ein PHP-Skript mit Echo ausgibt, interpretiert der Browser als HTML.

mfg matze


ice-breaker - Sa 23.07.05 19:31

user profile iconmatze.de hat folgendes geschrieben:
user profile iconice-breaker hat folgendes geschrieben:
user profile iconmatze.de hat folgendes geschrieben:
Nein du schreibst ein <br> oder ein <p> hin.
Bei <p> haste aber nen großen Zeilenabstand, also nimm <br> :)

mfg matze

hmm, also wenn es in ne text-datei geschrieben wird, warum dann ein <br> ?
da wäre ein \n doch sehr viel sinnvoller, oder speichert er als html?


Das was ein PHP-Skript mit Echo ausgibt, interpretiert der Browser als HTML.

mfg matze

ach das wird ausgelesen? sorry, ahbe ich gar net gesehen
dann am besten natürlich ein <br>


JayEff - So 24.07.05 01:11

So, ich denke nun ist das Tut echt klasse. Ich hab auch mal ein Skript geschrieben, eine "Diashow", ganz einfach, aber aus einem mir nicht begreiflichen Grund sind die Kommentare unter den Bildern manchmal ... seltsam verschoben. Im augenblick darf man eben keine doppelten ;; machen, weil dass das Trennzeichen ist xD


Christian S. - So 24.07.05 01:37

Keiner will meine tolle User-Überprüfung :-(


JayEff - So 24.07.05 01:59

Hm also ich finde sie sehr elegant. Aber die ursprüngliche klappt doch (also die, die er jetzt hat), darum besteht doch kein Änderungsbedarf. Ich glaube nicht, dass man auf Webservern auf PHP performance achten muss, darum... Wer will solls einbauen. (ot und so...)


Christian S. - So 24.07.05 02:06

Funktionieren tut sein Code, aber in einem Tutorial will man doch schönen Code, oder? Also nicht das Zeug, das man tippt, wenn keiner hinguckt :D

user profile iconJayEff hat folgendes geschrieben:
Ich glaube nicht, dass man auf Webservern auf PHP performance achten muss
Naja, kommt drauf, wie sehr die Seite frequentiert wird. Im DF achten wir schon ein wenig drauf, obwohl die DB-Abfragen oft die meiste Zeit in Anspruch nehmen.


JayEff - So 24.07.05 02:07

Yo genau, wie wärs, wenn man dem Skript noch eine DB version beilegen würde? Geht sicher schneller als der Zugriff auf eine Datei - und wenn ich 1000 User&Pws hab? Dann gehts mit ner DB sicher schneller, oder?


Christian S. - So 24.07.05 02:10

Vor allem muss man sich keine Gedanken drüber machen, was passiert, wenn mehr als ein Nutzer gleichzeitig auf die Datei zugreift ;-) Wenn man alles in eine DB auslagert, meine ich.


JayEff - So 24.07.05 02:12

Ach ja stimmt! Ist auch unpraktisch, wenn das Skript 2 mal gleichzeitig zugreift. Es würde sicher zu fehlern kommen, oder?

...hm. Ist das wieder n klares Beispiel für nen überflüssigen Post? omg.. 2 uhr is einfach zu spät... Ich sag nur noch intelligente sachen ab jetzt.


matze.de - So 24.07.05 08:37

Christian ich hab gar keine LoginVariante von dir gesehn oO. Das mit dem MySQL kann ich noch hinzufügen als 2 Skript, gute Idee! Ich denke es gibt keine großen Probleme, wenn mehrere Benutzer auf das eine PHP-Skript zugreifen. Oder habt ihr hier das DF auch auf mehrere Server verteilt, falls zu viele User auf z.B. die index.php zugreifen?

mfg matze

// Ich korrigiere mich, deine Variante sieht sehr elegant aus! ;)


Christian S. - So 24.07.05 11:42

Moinmoin!

user profile iconmatze.de hat folgendes geschrieben:
Ich denke es gibt keine großen Probleme, wenn mehrere Benutzer auf das eine PHP-Skript zugreifen.
Das Problem liegt nicht bei dem Skript, sondern bei der Datei, in die geschrieben wird. Ich habe mich damit jetzt nicht eingehend beschäftigt, aber man sollte prüfen, was passiert, wenn zwei Skripte versuchen, gleichzeitig in die selbe Datei zu schreiben.

Ich hatte (damals, als alles noch besser war ;-)) mal ein kleines dateibasiertes CMS geschrieben, dass einen Downloadcounter in einer txt-Datei ablegte. Das lief 'ne Weile ganz gut, doch irgendwann war die Datei plötzlich leer. Ich habe nie richtig nachgeforscht, woran es gelegen hatte, aber es war direkt, nachdem ein Programm bei Winload.de aufgenommen und somit oft runtergeladen wurde. Kann also durchaus an gleichzeitigem Zugriff gelegen haben. Aber wie gesagt: Ist ein bisschen geraten. :-)

Grüße
Christian


matze.de - So 24.07.05 12:12

Dafür "lock" ich die datei ja, wenn grade nen zugriff ist, bekommt der nächste keinen mea...

mfg matze :)


JayEff - So 24.07.05 15:17


Die Variante von Chistian S:
1:
2:
3:
4:
5:
function is_login($User, $Password){        
  global $users, $pws;        

  return ((($i = array_search($User, $users)) !== FALSE) && ($pws[$i] == $Password));   
}


matze.de - So 24.07.05 15:48

Hatte ich schon gesehen JayEff. Is auch schon im tut drinne seit paar stunden.

mfg matze


ice-breaker - So 24.07.05 21:57

user profile iconChristian S. hat folgendes geschrieben:
Moinmoin!

user profile iconmatze.de hat folgendes geschrieben:
Ich denke es gibt keine großen Probleme, wenn mehrere Benutzer auf das eine PHP-Skript zugreifen.
Das Problem liegt nicht bei dem Skript, sondern bei der Datei, in die geschrieben wird. Ich habe mich damit jetzt nicht eingehend beschäftigt, aber man sollte prüfen, was passiert, wenn zwei Skripte versuchen, gleichzeitig in die selbe Datei zu schreiben.

Ich hatte (damals, als alles noch besser war ;-)) mal ein kleines dateibasiertes CMS geschrieben, dass einen Downloadcounter in einer txt-Datei ablegte. Das lief 'ne Weile ganz gut, doch irgendwann war die Datei plötzlich leer. Ich habe nie richtig nachgeforscht, woran es gelegen hatte, aber es war direkt, nachdem ein Programm bei Winload.de aufgenommen und somit oft runtergeladen wurde. Kann also durchaus an gleichzeitigem Zugriff gelegen haben. Aber wie gesagt: Ist ein bisschen geraten. :-)

Grüße
Christian
sobald einer auf die daten zugreift und der select der datei noch nicht beendet wurde (durch schließen der datei oder beendigung des scriptes) kann kein weiterer darauf zugreifen, das ist der vortiel von Datenbanken, dort werden meist bei einem Select logische neue datenbänke erstellt damit mehrere user gleichzeitig zugreifen können

hmm, vllt setze ich mich ja mal dran und mach das mit ner DB, wäre ne idee, mal sehen^^


ice-breaker - So 24.07.05 22:24

@matze: ich habe mir eben nochmal dein script angesheen, dabei ist mir folgendes aufgefallen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
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;   
}


schau dir mal die schleife foreach() [http://de.php.net/manual/de/control-structures.foreach.php] an, die kann dir sowas ziemlich erleichtern
und dann muss ich nochwas bemerken, auf einigen Servern mit gewissen apache- und php-einstellungen kann es nicht funktionieren eine datei zu erstellen (fopen mit w+) da man dafür schon ein chmod 777 brauch, zudem gibt es in dem script noch viel viel mehr stellen, wo fehler auftreten können, weil so gut wie jede funktion gibt ein return zurück, und da man das php ja nicht selbst aufruft, sondern delphi das erledigt, sollte man schon alle fehler beachten

so mal wieder nen bissel klugscheißen aber das ist der einzige weg wie ich mich im mom hier einbringen kann, delphi lerne ich erst

mfg ice-breaker


matze.de - Mo 25.07.05 10:03

@ice-breaker: Ich weiß auch das bei manchen Webservern die Config es nicht zulässt Dateien zu erstellen, da lässt sich aber nun mal nichts dran machen, weil man oft keinen Zugriff auf die php.ini hat.
@is_login: Wie du siehst hab ich sowieso die von Christian S. bevorzugt.

mfg matze


wolle- - So 31.07.05 14:24

Ich hätte das gerne in MYSQL das sieht geil aus


matze.de - So 31.07.05 14:28

Macht dann 50€.... ne musste warten, bis sich einer dessen erbarmt, aber ich hab atm keine zeit dafür.. vllt kannstes ja auch selber probieren, is ja im grunde nicht viel anders...

mfg matze


wolle- - So 31.07.05 16:21

Das Probier ich grade aber ist schon anders :S Danke erstmal


JayEff - Mo 01.08.05 07:38

Was die Datei betrifft: Man kann doch noch zusätzlich die Anweisung geben, die Datei als leere Textdatei hochzuladen und chmod777 manuell zu verteilen...? Das würde das Problem schonmal beheben - Vielleicht erwähnst du es so am Rande ...
Hab aber nicht nachgeguckt, obs nicht schon da steht,w enn ja, sorry... ^^


Erutan - So 18.08.13 18:00

user profile iconwolle- hat folgendes geschrieben Zum zitierten Posting springen:
Ich hätte das gerne in MYSQL das sieht geil aus


Hallo,

der Thread ist zwar schon ein wenig älter aber wahrscheinlich wird er noch von hunderten Interessierten via google gefunden und angesteuert. Daher hier der Tipp:
Wer MySQL-Datenbanken statt der Flatfiles verwenden will, findet hier eine sehr sehr gute Erklärung wie man das macht:
http://www.schattenbaum.net/

Nun hab' ich aber noch eine Frage:

Gibt es irgendeine Möglichkeit, mit den Werten in der Flatfile-Datenbank (wenn Zahlen vom Typ REAL) zu rechnen? Und wenn ja, wie geht das?

Zur Erläuterung:

Ich habe diesen interessanten Thread gefunden weil ich mit Delphi ein paar Zufallsgeneratoren geschrieben habe, mit denen in einer Community die Möglichkeit der Einflußnahme des Bewußtseins auf maschinelle Vorgänge statistisch erprobt werden sollen (sprich: Telekinese).

Die Programme ermitteln nach Ablauf eines festgelegten Zeitraums einen Ergebniswert in Form einer Zahl mit maximal zwei Nachkommastellen.
Diese Zahl wird dann an den Server übertragen und in eine Tabelle eingetragen.

Es werden sehr viele solcher Zahlen eintrudeln und sie sollen vom PHP-script statistisch ausgewertet werden. Das heißt nichts anderes, als dß ein Querschnitt berechnet werden soll. Dazu werden alle Zahlenwerte adiert und durch die Anzahl der Werte geteilt.

Herauskommen soll ein einzelner statistischer Wert, der sich natürlich mit jedem neu hinzukommenden Ergebnis ändern wird bzw. soll.

Er soll ferner mit parallel ermittelten Zufallswerten verglichen werden.

Geht das? Und wenn ja, wie?

Mit Delphi würde ich die Werte in der Text-Datei via StrToInt in Zahlenwerte umwandeln. Wie das aber mit PHP geht und ob es überhaupt geht, weiß ich leider nicht.

Wäre schön wenn mir das jemand erklären könnte.

Grüße
Erutan