# PHP - Komplettes Loginsystem mit Textdateien



## Alexander12 (30. August 2005)

Hi.

Ich will ein komplettes Loginsystem für meine Webseite schreiben, in PHP (natürlich), hab' auch schon einiges gemacht (Formulare, ein paar Skripte etc.  ;-) ). Mein Anbieter stellt leider keine MySQL Datenbank bereit, deswegen mit Textdateien. Beim registrieren soll der User eine fortlaufende ID bekommen, einen Benutzernamen eingeben, ein Passwort mit anschließender Wiederholung, die E-Mailadresse und es soll ein Bild angezeigt werden mit Buchstaben, die der User eingeben muss, damit es auch wirklich ein Mensch ist, wo sich registriert. In der Textdatei steht jede Zeile für einen User. 
Nun meine erste Frage:
Kann ich in PHP wie in C#.NET(da weiß ich wies geht) mehrere Parameter gleichzeitig in eine Zeile schreiben? 
Bei C# kann ich das so machen: {1},{2},{3}, name, email, passwort
Hier mein Code in PHP:


```
<?php 
$name = "Hallo";
$userID = "1"
$passwort = "hier";
$email = "aa@aa.de";
//und so weiter ...
$datei = fopen("user.txt","w+");
fputs($datei, $name);
?>
```
Weiß jemand wie ich den Code änderm muss, damit ich alle Parameter ($userID, $name, etc.) in eine Zeile quetschen kann und dass Sie durch ein Semikolon o.ä. getrennt sind? Da komm ich echt nicht weiter. 
Nun meine zweite Frage:
Also so soll es dann in der Textdatei aussehen, in die wir oben eintragen:

1;Hallo;hier;aa@aa.de;30.08.05

Zum auslesen hab' ich auch schon ein Script, aber das passt da nicht, Der Benutzer soll sich ja mit den Felder ID, Name, Passwort einloggen. Nun soll er die Zeile auslesen in der die eingegebene ID steht und alle Werte miteinander vergleichen. Weiß jemand wie man das so auslesen kann und gibt mir einen Tipp?
Den Rest hab' ich alles schon geproggt.

Nun noch 'ne Frage:
Wenn ihr gar keine Datenbank zur Verfügung hättet (also so wie ich  ), würdet ihr es ganz anders machen? Vielleicht mit Sessions, aber da kenn ich mich noch nicht so gut aus ...

Vielen, Vielen Dank für eure Antworten schon Mal!!   

MfG Alexander12


----------



## Dr Dau (30. August 2005)

Hallo!

Ich glaube so müsste es klappen:

```
fputs($datei, $userID.";".$name.";".$passwort.";".$email);
```
Ich weiss aber nicht wie man damit ein Login realisieren kann.
Du solltest dann die Passwörter natürlich verschlüsseln.

Ohne Datenbank..... kommt halt drauf an was für eine Seite es werden soll.
Das Einfachste währe sicherlich über .htaccess.
Eine andere Möglichkeit währe es, auf fertige Lösungen zurückgreifen (so gibt es z.b. auch Foren die ohne MySQL auskommen).
Oder Du wechselst dein Hoster. 

Gruss Dr Dau


----------



## Dennis Wronka (31. August 2005)

Du koenntest die User-Daten in einen Array packen und diesen serialisiert in die Datei schreiben.
Beim auslesen wandelst Du das ganze wieder in einen Array um.
Der Vorteil der Geschichte ist, dass Du dann gleich alle Nutzerdaten in einem Array hast.
Du koenntest dann so in einem 2-dimensionalen Array alle User speichern und musstest nicht mit 2 Millionen Variablen hantieren.
Ausserdem waere es so auch einfach die Anzahl der User festzustellen und und und...

Schau Dir dazu mal serialize() und unserialize() an.

Was ist eigentlich aus meinem Vorschlag mit SQLite geworden?
Keine Ahnung? Keine Lust? Keine Unterstuetzung in PHP?


----------



## BSA (31. August 2005)

Ich würde es mir einfacher machen und einfach den Hoster wechseln.


----------



## Dennis Wronka (31. August 2005)

BSA hat gesagt.:
			
		

> Ich würde es mir einfacher machen und einfach den Hoster wechseln.


Das groesste Problem was ich bei Textdateien, und auch bei SQLite, sehe ist die Sicherheit.
Denn man brauchst nur im Browser den Namen der Textdatei eingeben und schon hat man alle Zugangsdaten.
Ich weiss nicht wie SQLite speichert, will gleich mal was damit rumspielen, aber ich denke nicht, dass es wesentlich sicherer ist, wenn ueberhaupt.

Daher ist der Vorschlag von BSA schon garnicht so schlecht.
Insbesondere User-Daten sind mit Vorsicht zu behandeln und sollten so gut wie moeglich geschuetzt werden.

Nachtrag:
Ich hab mir grad mal SQLite angesehen und muss sagen: Ist eigentlich keine schlechte Sache.
Aber: Es scheint kein Auto_Increment zu geben, fuer die IDs muss man selbst sorgen, was aber mit wenigen Zeilen Code machbar ist.
UNSIGNED INTs scheint es auch nicht zu geben. Aber naja, es gibt schlimmeres.
Was aber, im Hinblick auf das Thema User-Daten, stoert, ist dass die SQLite-Datei recht einfach zu lesen ist.
Aber fuer eine Bildergallerie ist's okay.
Ich hatte ja hier vor einer Weile mal eine Gallerie (in 3 Ausfuehrungen) auf MySQL-Basis gepostet. Diese hab ich mal fix auf SQLite umgestrickt.
Funktioniert ganz gut. Wie gesagt, ein paar Anpassungen, aber nichts wildes.


----------



## Sven Mintel (31. August 2005)

Ich würd wohl keine Textdateien nehmen, sondern gleich PHP-Skripte erzeugen, wo die Userdaten in Variablen/Arrays gespeichert sind.

Sicherheitsprobleme sehe ich nicht unbedingt... die Sachen kann man ja schliesslich ausserhalb des DOCUMENT_ROOT lagern.
Oder man gibt ihnen eine andere Dateiendung und unterbindet den Zugriff per .htaccess
(eine Datei namens *.htuserdb* wäre schliesslich auch nicht per HTTP aufrufbar...includen o.ä. könnte man sie aber trotzdem jederzeit)


----------



## Alexander12 (31. August 2005)

Hi.

@Dr Dau:
Danke für den Tipp mit dem Code!
Aber den Hoster wechseln, ich weiß nicht, das kostet und kostet, ich bin doch auch nur ein einfacher Schüler ........

@reptiler:
Ich werde mir das mit dem seralisieren gleich heute Mal angucken.
SQLite ist nicht so das richtige find ich, es ist halt ein Dos-Programm. Da fände ich Access schon besser. Wenn mir da jemand Hilfe geben könnte (Verbindung, Auslesen; Schreiben) das wäre echt super!! 

Deinen Vorschlag (das ist jetz @Sven Mintel) mit *.htaccess find ich auch interessant. Hab' ich schon oft hier im Forum gehört, scheint gut zu sein.

Aber um nochmal aufs Access zurückzukommen; Ich hab' da Mal Code zum connecten entdeckt:

```
if (!$conn = new COM("ADODB.Connection"))
exit("Unable to create an ADODB connection<br>");
$strConn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("test.mdb"); 
$conn->open($strConn);
```
Ist das überhaupt was?

MfG Alexander12


----------



## Dennis Wronka (31. August 2005)

SQLite ist kein DOS-Programm, sondern eine platformunabhaengige Library, urspruenglich wahrscheinlich unter einem Unix entwickelt und dann portiert.


			
				www.sqlite.org hat gesagt.:
			
		

> SQLite is a small C library that implements a self-contained, embeddable, zero-configuration


Die Libraries sind in PHP5 bereits enthalten und Du brauchst nichts weiter.
Denn es ist, wie gesagt, "embeddable", also "einbettbar", was bedeutet, dass nichts weiter benoetigt wird.


----------



## Alexander12 (31. August 2005)

Hi.

Um nochmal auf die Textdokumente zurückzukommen:
Ich hab' eine wahnsinnig tolle Idee und ich wollte nun eure Meinung hören:

Ich habe jetzt ein Formular mit dem man sich registriert:
4 Textboxen, eine für Benutzername, 2 für Passwort(also mit wiederholung) und noch eine für die Emailadresse. und ein Submit Button (ACTION="register.php".

Nun das Skript "register.php":

Das Skript bekommt die 4 Werte per $_POST. Das Skript erstellt 2 Textdokumente.
Wenn man sich z.B. mit diesen Daten registriert:

- Benutzername: "Alexander"
- Passwort:        "hallo"
- Passwort(wdh):"hallo"
- Email:             "aa@aa.de

Dann erstellt das Skript diese 2 Textdokumente:
1. Dokument:
Alexander.txt
Inhalt: aa@aa.de
2. Dokument:
hallo.txt
Inhalt: aa@aa.de

Das Skript überprüft natürlich vor dem Registrieren natürlich ob die schon vorhanden sind und ob die Passwörter identisch sind.   

Wenn Man sich nun einloggt, öffnet das Skript login.php die Textdatei(wenn vorhanden) des eingegebenen Usernamens und das des eingegebenen Passworts die er $_POST (also hier wäre das dann, wenn wir die Daten von oben nehmen: Alexander.txt und hallo.txt). Dann liest er die Inhalte(also die Emailadresse) bei beiden aus und vergleicht Sie. Wenn Sie gleich sind, ist der User eingeloggt.

Was sagt ihr dazu?   
Würdet ihr noch was verändern?

MfG Alexander12


----------



## Sven Mintel (31. August 2005)

Alexander12 hat gesagt.:
			
		

> Aber um nochmal aufs Access zurückzukommen......Ist das überhaupt was?


nur auf Windows-Servern mit installiertem Access.


----------



## Alexander12 (31. August 2005)

Hi.

Tja, dann scheidet Access wohl oder übel aus (*AufDieTastaturVorMirKotz*) ...

MfG Alexander12


----------



## Sven Mintel (31. August 2005)

Noch mal zu meinem Vorschlag, gleich ein PHP-Skript zu erzeugen(sind ja im Endeffekt auch nur Textdateien):

.htuserdb

```
$userdb=array();
$userdb['alexander']=array('mailadresse','md5(passwort)');
$userdb['sven']=array('mailadresse','md5(passwort)');
```
diese Datei includest du beim Login.

Wenn du prüfen willst, ob ein Benutzer existiert:

```
if(isset($userdb[strtolower('Benutzername')]))
```
Wenn du prüfen willst, ob das Passwort stimmt:

```
if(md5('passwort')==($userdb[strtolower('Benutzername')][1]))
```
...usw.

Bei sehr vielen Benutzern könntest du mehrere "htuserdb"-Dateien verwenden, bspw. unterteilt nach Anfangsbuchstaben:
.htuserdb_a,.htuserdb_b,usw.

Der Zugriff dürfte so ungleich schneller sein, weil die Daten nicht erst in Variablen überführt werden müssen.


----------



## Pendergast (31. August 2005)

Alexander12 hat gesagt.:
			
		

> Was sagt ihr dazu?


Ich find es nicht gut. Was machst du zum Beispiel, wenn zwei User das gleiche Passwort haben? Soll ja noch immer viele Leute geben, die Standardpasswörter wie etwa _Passwort_ nutzen. Passwörter mit Sonderzeichen lässt du damit auch nicht zu. Dazu wird das Passwort auch noch unverschlüsselt gespeichert, mir wäre nicht wohl dabei (auch dann nicht, wenn du es außerhalb des Dokumentenverzeichnisses speicherst).

Du hast auch noch immer nicht gesagt, ob du SQLite nutzen kannst. Das scheint mir für dich wirklich die beste Lösung. Wobei ich den Vorschlag von Sven auch nicht so schlecht finde, ich persönlich hab aber echte Datenbanken lieber.


----------



## Alexander12 (31. August 2005)

Hi.

@Sven:

Der Vorschlag ist echt gut! ich werde ihn jetzt sofort ausprobieren.   

MfG Alexander12


EDIT: 
Hmm.. Ich krieg das irgendwie nicht zum Laufen:
Hier mein Code:
login.php:

```
<?php
include("userdb.php");
$username = $_POST["username"];
$passwort = $_POST["passwort"];
if(md5($passwort)==($userdb[strtolower('Benutzername')][1]))
{
	echo("Hallo $username");
}
else
{
	echo("Login fehlgeschlagen, Falsche Daten!");
}
?>
```
In der Datei userdb.php stehen nur diese 2 Zeilen:


```
$userdb=array();
$userdb['Alexander12']=array('aa@aa.de','md5(hallo)');
```

Hab' Ich was Falsch gemacht?

MfG Alexander12


----------



## Alexander12 (31. August 2005)

Hi.

Ich habe jetzt ein Hoster gefunden der günstig ist und eine MySQL Datenabank bereitstellt!(    )!! Da brauch Ich wahrscheinlich gar nicht zu Fragen, MySQL wird die beste Lösung für mein Problem sein. Ihr hättet es wahrscheinlich gleich so gemacht. Vielleicht mach ich dazu nen neuen Thread auf, ich weiß noch nicht. Trotzdem Vielen, Vielen Dank für eure Antworten, diese Forum ist echt super, das muss ich sagen!  

MfG Alexander12


----------



## Sven Mintel (31. August 2005)

Alexander12 hat gesagt.:
			
		

> Hab' Ich was Falsch gemacht?



Da muss statt md5(hallo) natürlich der md5()-Hash von hallo rein 
(der Array-Schlüssel muss ebenfalls kleingeschrieben werden)


```
$userdb['alexander12']=array('aa@aa.de','598d4c200461b81522a3328565c25f7c');
```

und dann:

```
<?php
include("userdb.php");
$username = $_POST["username"];
$passwort = $_POST["passwort"];
if( isset($userdb[strtolower($username)])
      && 
    md5($passwort)==$userdb[strtolower($username)][1] 
  )
{
    echo("Hallo $username");
}
else
{
    echo("Login fehlgeschlagen, Falsche Daten!");
}
?>
```


----------



## Alexander12 (31. August 2005)

Hi Sven.

Danke für die ausfühliche Erklärung. Ich werde das jetzt ausprobieren. Wenn es funktioniert dann bleib' ich bei meinem Hoster, ansonsten muss ich wohl in den Sauren Apfel beißen und den Hoster wechseln.

MfG Alexander12


----------



## Alexander12 (31. August 2005)

Hi. 

Es funktioniert!!   
Kann ich mit einem Registrierungs-Formular eigentlich Daten zu dem Array (in userdb.php) hinzufügen oder geht das nur von Hand mit dem Editor?  :suspekt: 

MfG Alexander12


----------



## Sven Mintel (1. September 2005)

per [phpf]fputs[/phpf] kannst du von einem anderen PHP-Skript aus in diese Datei schreiben, was du willst...du musst also nicht persönlich aktiv werden.

Vorraussetzung ist, dass du bei fopen() einen Pfad im lokalen Dateisystem angibst(also ohnne http://)... der Rest funktioniert wie auch bei einer Textdatei.
Achte aber darauf, dass der Inhalt der Datei von PHP-Tags eingeschlossen sein muss.


----------



## Dr Dau (1. September 2005)

Alexander12 hat gesagt.:
			
		

> .....Aber den Hoster wechseln, ich weiß nicht, das kostet und kostet, ich bin doch auch nur ein einfacher Schüler.....


Warum nicht?
Du kannst ja auch verschiedene Hoster nehmen..... wenn Du denn meinst dass Du mit deinem jetzigen soweit zufrieden bist.
Ausserdem gibt es auch kostenlose Hoster..... mit MySQL Unterstützung.
Spontan fallen mir da Funpic und Cybton ein..... ich kann zwar nichts zu diesern Hostern sagen, aber ich bin mir zu 101,5%  sicher dass Du hier im Forum ein paar Einträge findest.

Ich bin sogar der Meinung dass es heute einfacher ist einen Free Hoster mit MySQL zu finden, als vor ein paar Jahren Free Hoster mit CGI Unterstützung.


----------



## Sven Mintel (1. September 2005)

Funpic gestattet nicht mal externes verlinken von x-beliebigen Dateien.... ich glaube kaum, dass es da möglich sein wird, eine DB von auserhalb abzufragen.

Und dort die Sache komplett zu machen: ich weiss nicht so recht, aber bei Google werden  dort gehostete Projekte wohl kaum eine Chance haben(mangels externer Links:suspekt: ), ... und zu dem Namen "funpic" sage ich mal garnix... ich schätze die Betreiber verbringen oftmals unruhige Nächte deswegen

Für 2-4 Euronen bekommt man mittlerweile passablen Webspace mit einer Menge Features und gutem Support, das sollte auch ein Schüler-Taschengeld hergeben können.


----------



## Dr Dau (1. September 2005)

Wie gesagt, ich kann zu den Hostern nichts sagen..... ich greife da lieber auf den Server im Keller zurück. 

Man könnte aber doch bestimmt das Gästebuch..... Forum..... oder was auch immer, in einem Frame integrieren.
Irgendwelche Einschränkungen hat man bei (fast) jedem Hoster..... es sei man gibt entsprechendes Geld aus.
Ob meine Seiten in Suchmaschinen auftauchen oder nicht, interessiert mich auch nicht.
Meine letzte "offizielle" Homepage stammt noch aus den Zeiten wo PHP grad im kommen war..... also nicht unbedingt aktuell. 
Selbst meine (im übrigen kostenlose) TLD verweist seit dem ersten Tag an nur auf eine leere Seite..... einem geschenktem Gaul schaut man halt nicht ins Maul.  

Aber die von dir angesprochenen LowBudget Hoster bieten in der Tat einiges mehr als die Kostenlosen.
Häufig z.b. eine TLD und nicht wenige POP3 Postfächer.
Für eine nicht kommerzielle Homepage durchaus brauchbar..... aber für z.b. ein Shop oder so, würde ich dann aber doch lieber auf was professionelles zurückgreifen.


----------



## Dennis Wronka (1. September 2005)

Cybton ist eigentlich garnicht so schlecht fuer einen kostenlosen Hoster.
Klar, man muss die Werbung ertragen, aber es gibt schlimmeres.

Meine TLD hat zuvor nach Hause gezeigt. Auch wenn der Server, jetzt wo ich nicht mehr da bin, nicht mehr 24/7 an ist.
Jetzt zieht meine Domain um und wird dann auch wieder genutzt.

Eine echte Datenbank ist auf jeden Fall solchen Geschichten wie Textfiles oder SQLite vorzuziehen. Allein schon aus Gruenden der Bequemlichkeit.


----------



## Alexander12 (1. September 2005)

Hi.



> Zitat von Dr Dau:
> ..... ich greife da lieber auf den Server im Keller zurück.


Das habe ich mir auch überlegt, aber der muss ja 24 Stunden am Internet hängen. Ohh... das kostet , weil wir haben hier nur dieses dreckige ISDN, wenn ich so was hier lese:

Downloadgeschwindigkeit: 5 kb/s

Da könnte ich auf die Tastatur schei**en, so hasse ich das.
Ich werde Mal die konstelosen Hoster anschauen. So ein bisschen Werbung halt auf der Site aber das ist ja zu ertragen ...

MfG Alexander12


----------



## Sven Mintel (2. September 2005)

Dr Dau hat gesagt.:
			
		

> .... ich greife da lieber auf den Server im Keller zurück.



Wieviel Strom verbraucht so eine Server im Keller eigentlich?
Ich schätze mal, dafür bekommt man schon mehr als ein kleines Einsteigerpaket :suspekt:


----------



## Irgendjemand_1 (2. September 2005)

Alexander12 hat gesagt.:
			
		

> Hi.
> 
> 
> Das habe ich mir auch überlegt, aber der muss ja 24 Stunden am Internet hängen. Ohh... das kostet , weil wir haben hier nur dieses dreckige ISDN, wenn ich so was hier lese:
> ...



funpic.de ist eigentlich ganz süß. Braucht man auch keine Zwangswerbung 
Natürlich bin ich so ein Schmarozer, der mind. 10 FTP+MySQL Zugänge zu richtigen Servern - von Leuten, die ein Game oder sonst irgendeine Seite mit einem gescheiten Server betreiben - hat und hab das nicht nötig  (is so ) Aber vom hörensagen ist funpic gar nicht mal so schlecht.

Ansonsten gibts auch für 2,99 oder so schon recht gute Server, die ausreichen.


----------



## Dr Dau (2. September 2005)

Sven Mintel hat gesagt.:
			
		

> Wieviel Strom verbraucht so eine Server im Keller eigentlich?
> Ich schätze mal, dafür bekommt man schon mehr als ein kleines Einsteigerpaket :suspekt:


Keine Anhnung..... ich weiss aber auch nicht was mein Linux Router so verbraucht. 
Habe ich halt nie gemessen..... auf jedenfall bringt es mich nicht um. 
Ich vertehe natürlich worauf Du hinaus willst.
Nur darfst Du auch nicht vergessen dass ich die Möglichkeiten, die sich mir durch einen eigenen Server im Keller eröffnen, nur durch einen Root-Server (von mir aus auch Managed-Server) bekommen würde..... z.b. Zugriff auf die php.ini oder httpd.conf usw.
Ich nutze den Server ja weniger zum Hosten, sondern mehr zum erlernen..... auch wenn ich es nicht brauche.
Natürlich habe ich auch ein paar Projekte drauf, aber auf den Server (per .htaccess geschützt) haben nur ein paar ausgesuchte enge Freunde Zugriff.


----------



## Sven Mintel (2. September 2005)

Dr Dau hat gesagt.:
			
		

> Natürlich habe ich auch ein paar Projekte drauf, aber auf den Server (per .htaccess geschützt) haben nur ein paar ausgesuchte enge Freunde Zugriff.



... jo, das glaube ich gerne, dass  da nur ein paar Freunde rauf dürfen, ansonsten würde wohl nicht mehr viel passieren.

Ich habe mir vor einiger Zeit mal testhalber nen Shoutcast-Server installiert.
Als dann 3 Kumpels zugehört haben, war Feierabend


----------



## Dr Dau (2. September 2005)

Ich habe ja nicht viel drauf..... das einzige was (gelegentlich) mehr oder weniger Auslastung bringt, ist mein Chat.
Für mich dreht es sich halt hauptsächlich darum dass sich nicht jeder Hans und Franz auf dem Server rumtreibt.
Was auch immer Shoutcast ist.  
Ein Gamer oder so bin ich auch nicht.
Wenn ich mal wirklich Bandbreite brauche, dann wenn ich Skype laufen habe..... oder mir (mal wieder) irgend eine Linux Distribition runterlade.
Für alles andere würde mir eigentlich auch ein 56k Modem langen.
Bis November letzten Jahres hatte ich nur ISDN..... und bin nur auf DSL umgestiegen weil es genauso viel gekostet hatte.


----------



## Sven Mintel (2. September 2005)

Dr Dau hat gesagt.:
			
		

> Was auch immer Shoutcast ist.



Shoutcast macht Musik

Ich höre was in winamp.... und die anderen hören's auch.


----------



## Dr Dau (2. September 2005)

Sven Mintel hat gesagt.:
			
		

> Shoutcast macht Musik


Meine Anlage auch. 
Also sowas wie Online Radio?!
Hmm, bei anderen (die das auch nur über DSL machen) können aber ein "paar" mehr als nur 3 Leute zuhören.
Aber ich denke dass bei denen der Stream über ein externen Server läuft, anderes kann ich es mir nicht vorstellen.
Keine Ahnung wie dass genau läuft..... interessiert mich auch nicht wirklich.


----------

