Anfänger-Problem --> dauert nicht lang ;-)

ich bin ein PHP-Anfänger…

wollte ein Script schreiben, dass nur kontrolliert ob der eingegebene Name schon existiert, und wenn er existiert einfach eine Fehlermeldung gibt à la echo „falsch“; und wenn nicht dann einfach weiter macht…
Ich hoffe sie können mir helfen, ich hab so eine Vermutung, dass es an den geschweiften Klammern liegen könnte, habe aber shcon alles versucht, und nie Erfolg dabei gehabt. :frowning:

Hier der Script:

if(check($name, $lines)) {
header („Location ./schlecht.php“);}
else
echo „hallo“;

$name = $HTTP_POST_VARS[„name“];
$pw = $HTTP_POST_VARS[„pw“];
$xpw = $HTTP_POST_VARS[„xpw“];

$lines = file(„user.txt“);

$len = count($lines);

function check($name, $lines) {

for($i = 0; $i

Würde mich sehr freuen.

Vielen Dank

CCFLy

ich bin ein PHP-Anfänger…

waren wir alle mal… :smile:

Die Funktion check sollte zuerst deklariert werden, bevor sie aufgerufen wird. Logikfehler in der Funktion check: ein Array wird mit einem String verglichen, anstatt festzustellen, ob der String im Array enthalten ist, und es werden nicht alle Zeilen durchlaufen. $len ist überflüssig. $lines kann in der Funktion bleiben, es ist ja unwahrscheinlich, dass dieser Array außerhalb der Funktion nochmal verwendet werden soll. Ich frage mich außerdem, ob anstatt HTTP_POST_VARS[] auch einfach $_POST[] reichen würde.

so sollte es gehen (ungetestet)

<?php function check($name) {
$lines = file("user.txt"); foreach ($lines as $line) { $entr\_arr = explode(";", $line); if (in\_array($name, $entr\_arr)) { return true; } } return false; } $name = $HTTP\_POST\_VARS["name"]; //$\_POST["name"] $pw = $HTTP\_POST\_VARS["pw"]; //$\_POST["pw"] $xpw = $HTTP\_POST\_VARS["xpw"]; //$\_POST["xpw"] if(check($name)) { header ("Location ./schlecht.php"); } else { print("hallo"); } ?\> Gruß, Rudy

übrigens…
wie sieht denn die Datei aus, die die Usernamen enthält? Ich habe aus dem Code interpretiert, dass es eine mehrzeilige Datei ist mit Benutzernamen, welche durch ein Semikolon getrennt sind.

User1;User2
Admin1;Admin2
\_0815;\_0816;\_0817

übrigens, sicher ist das nicht gerade, wenn das so in einem Textfile liegt, ich hoffe das ist Dir bewusst. Besonders wenn Du Passwörter speicherst solltest Du sie nur md5()-kodiert speichern und kodiert vergleichen - sollte jemand die Datei dann bekommen, kann er damit wenigstens nix anfangen.

Gruß,
Rudy

ich vermute das Funktioniert nicht

function check($name) {
$lines = file(„user.txt“);
foreach ($lines as $line) {
$entr_arr = explode(";", $line);
if (in_array($name, $entr_arr)) {

hier ist das Problem…
Wenn ein array aus einer Datei kommt dann stehen meistens aber nicht immer hinten die return characters \n, \r oder sogar kombiniert.
Diese hängen dann an jedem Namen dran, tauchen aber nicht ersichtlich in einer html-Ausgabe auf.
Ich würde das eher ein wenig anders angehen und aus den ganzen Namen einen langen String bilden.
Diesen mit der Funktion implode
anschliessend würde ich überprüfen ob der name in diesem kompletten String drin ist.
etwa mit if (strpos(" ".$string,$name)>0) return true;
AAAAAber…
Ein Name „Klaus“ würde dann auch gefunden werden, wenn es nur einen „Klaus-Peter“ gibt.
Von daher ist die komplette konzeptionierung auf Textdateienbasis sehr wackelig meiner Meinung nach.

Tut es aber…

function check($name) {
$lines = file(„user.txt“);
foreach ($lines as $line) {
$entr_arr = explode(";", $line);
if (in_array($name, $entr_arr)) {

hier ist das Problem…
Wenn ein array aus einer Datei kommt dann stehen meistens aber
nicht immer hinten die return characters \n, \r oder sogar
kombiniert.

Kommt auf den Editor und das Betriebssystem an, ob nur ein linebreak und/oder return vorkommen. Windows \n\r unter Windows, \n unter UNIX, \r bei Mac, außer bei speziellen Editoren, wo sich das festlegen lässt. Ich habe die User-Datei entsprechend meiner Vorgabe mit Notepad unter Windows erstellt und auf einem Linux-Webspace mittels print_r die Arrays überprüft, das Skript funktioniert.

Diese hängen dann an jedem Namen dran, tauchen aber nicht
ersichtlich in einer html-Ausgabe auf.

Deswegen gehören sie auch zu den unsichtbaren Steuerzeichen.

Ich würde das eher ein wenig anders angehen und aus den ganzen
Namen einen langen String bilden.

ein explode(";", trim($line)) täts auch - anscheinend „explodiert“ aber der Line-Break am Ende von selbst weg, jedenfalls gibts kein leeres Array-Element in $entr_arr auch ohne trim.

Diesen mit der Funktion implode
anschliessend würde ich überprüfen ob der name in diesem
kompletten String drin ist.
etwa mit if (strpos(" ".$string,$name)>0) return true;
AAAAAber…
Ein Name „Klaus“ würde dann auch gefunden werden, wenn es nur
einen „Klaus-Peter“ gibt.

Ja, und wenn jemand „uschi“ eingibt heißt dann findet das Skript auch den User…

Von daher ist die komplette konzeptionierung auf
Textdateienbasis sehr wackelig meiner Meinung nach.

Ja, ist es, und unsicher dazu. Deine Abänderung macht es aber leider noch schlimmer.
User/Passwörter sollten kodiert in einer Datenbank gespeichert werden, das ist der saubere Weg, schon allein der Erweiterbarkeit wegen. Du musst dann auch nicht zwangsläufig jedem, der Zugang zum Webspace hat (oder erhält), zugleich Zugang zu den Benutzerdaten geben.

Gruß,
Rudy

fast … :smile:
muss mich korrigieren *ganzrotwerd*
explode(";", trim($line)) ist notwendig. Dann passts. Ich hatte es fälschlicherweise mit einem User getestet welcher in der Mitte der Zeile stand, mit einem am Zeilenende gibt es sonst Probleme.

Gruß,
Rudy

Also ich hab mir jetzt alles angesehen, werde es noch ausprobieren und mir noch richig zu Gemüte führen müssen.

Aber vielen Dank für eure Hilfe.

Ja das txt-File besteht aus:

User1,PW1
User2,PW2

und zu den COdierungen, da hab ich leider keine Ahnung, wie das gehen soll.

Ähm, sorry ,wenn ich euch wieder störe damit, aber das funktioniert irgendwie nicht:

Mein Script, den ich einfach kopiert habe, von Rudi.

<?php function check($name) {
$lines = file("user.txt"); foreach ($lines as $line) { $entr\_arr = explode(";", trim($line)) if (in\_array($name, $entr\_arr)) { return true; } } return false; } $name = $HTTP\_POST\_VARS["name"]; $pw = $HTTP\_POST\_VARS["pw"]; $xpw = $HTTP\_POST\_VARS["xpw"]; if(check($name)) { header ("Location ./schlecht.php"); } else { print("hallo"); } ?\> Fehlermeldung: Parse error: syntax error, unexpected T\_IF in C:\apachefriends\xampp\htdocs\can\R\_Tool\Login\reg2.php on line 6

Du hast ein Semikolon rausgelöscht…

$entr_arr = explode(";", trim($line))

Gruß,
Rudy