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
matze.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
WeBsPaCe hat folgendes geschrieben: |
matze.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 public 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
JayEff 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:
wolle- 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
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 Christian 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
wolle- 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
ice-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
matze.de hat folgendes geschrieben: |
ice-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
ice-breaker hat folgendes geschrieben: |
matze.de hat folgendes geschrieben: | ice-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
matze.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
ice-breaker hat folgendes geschrieben: |
matze.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
matze.de hat folgendes geschrieben: |
ice-breaker hat folgendes geschrieben: | matze.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
JayEff 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!
matze.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
Christian S. hat folgendes geschrieben: |
Moinmoin!
matze.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
wolle- hat folgendes geschrieben : |
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!