Problem mit dem Vergleich eines Eingabe- und MySQL-Wertes

dUDALUS

Grünschnabel
Hallo

Ich habe micht entschlossen, mal etwas mit PHP und MySQL rumzuprobieren. Ich habe mich mal etwas eingelesen und mich dann an die Arbeit gemacht. Das Verbinden, Auswählen und Selecten geht alles, nur hat er anscheinend Probleme beim Vergleich des MySQL Passwortes und jenes aus dem Loginfenster. Hier eine kleine Übersicht:

index.html = Loginfenster mit Eingabeboxen und Submit Feld
login.php = MySQL Code und Ausgabe

Bitte seid nicht hart zu mir, ich werde das Ganze später (wenn es komplett ist) per Templatesystem Smarty auslagern, da noch CSS Code hinzukommen wird ;)

Nun zum eigentlichen Problem:

Mein Datensatz hat den 'namen' Test2 und das 'password' 123. Nun verbinde ich, wähle aus und benutze ein assozitives Array, um die Arraywerte mit Namen ansprechen zu können. Wenn ich dort das 'password' per var_dump ausgebe, funktioniert alles und 123 wird ausgegeben.

Nun möchte ich logischerweise das Eingabepasswort mit dem Arraypasswort aus der MySQL Tabelle vergleichen, jedoch kommt hierbei immer die else Schleife. Ersetze ich 'password' durch den Stringwert 123, funktioniert es und die if Meldung kommt (Erfolg). Ich sleber sehe leider keinen Fehler oder ich kenne ihn (noch) nicht. Ich wäre um euren Rat sehr dankbar.

index.html
HTML:
<html><head>
<title>Loginsystem</title>
</head><body>

<form action="login.php" method="post">
Name: <input type="text" name="username" size="20"><br>
Passwort: <input type="password" name="password" size="20"><br>
<input type="submit" value="Einlogen">
</form>

</body></html>

login.php
PHP:
<?php

// Verbindung zum nicht passwortgeschützten MySQL Server
$link = mysql_connect("localhost", "root", "")
or die ("Konnte nicht verbinden, Grund ".mysql_error());

// Datenbank test2 wird angewählt
$db_selected = mysql_select_db("test2")
or die ("Konnte Datenbank nicht auswählen, Grund ".mysql_error());

// Die Zeile, wo der name = Username (Wert vom Loginfenster) ist, wird angewählt
$result = mysql_query("SELECT * FROM gefahrgut WHERE name = '".$_POST['username']."'");

// Die Zeile wird gefetcht und ein mit dem Arraynamen ansprechbares Array "row" gespeichert
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
{
	var_dump($row['name']); // Testausgabe des MySQL Eintrages "name"
	var_dump($row['password']); // Testausgabe des MySQL Eintrages "password"
}
var_dump($_POST['password']); // Testausgabe des Login Eintrages "password"

if($row['password'] == $_POST['password']) { // Ist MySQL Passwort = Login Passwort
	echo("Test ok"); // Erfolg
} else {
	echo("Test nicht ok"); // Misserfolg
}  
	
?>

var_dump Meldungen mit dem Eingabepasswort 1235:
string(5) "Test2" string(3) "123" string(4) "1235" Test nicht ok

MfG dUDALUS

Edit
Anscheinend ist der Wert $row ausserhalb der while Schleife nicht gültig. Wie erstelle ich zB ein globales Array ?
 
Zuletzt bearbeitet:
Indem du in der Schleife noch ein Array definierst:
zb
PHP:
while($row = mysql_fetch_array())
{
     $array['name'][] = $row['name'];
     $array['password'][] = $row['password'];
}
var_dump($array);
echo "<pre>";
print_r($array);
echo "</pre>";
 
Hallo

Gibt es da keine einfachere Lösung ? Wenn ich zB 20 Werte im ASSOC Modus auslese, habe ich 20 Zeilen für das "neue" Array. Kann ich ein Array nicht global definieren ?

Simon
 
Hallo dudalus,

sorry aber irgendwie ist deine While-Schleife sinnlos, da du ja $row bei jedem Durchlauf überschreibst.
Wieso überprüfst du nicht direkt im MySQL-Query auf ein richtiges Passwort?
PHP:
$sql = "SELECT * FROM gefahrgut WHERE name='".$name."' AND password='".$password."'";

Übrigens ist dein Skript nicht vor Einschleusen von SQL-Code geschützt, da du z.B. die POST-Variable "name" direkt im Query verwendest. Man sollte sie vorher mit [phpf]mysql_real_escape_string[/phpf] "entschärfen".
Siehe auch mein Tutorial in meiner Signatur "Sicherheit in PHP-Codes schaffen".

Übrigens würde ich dir dringend raten, dass du das Passwort in der DB verschlüsselst (Einwegverschlüsselt!) speicherst, damit auch wenn sich jemand Zugriff zur DB verschafft, das Passwort nicht herausfinden kann.

Die Variable $row ist nicht mehr außerhalb der While-Schleife gültig, deshalb musst du sie außerhalb dieser deklarieren, z.B.:
PHP:
$row = NULL;
while(...)
{
  ...
}
if ($row==...)
{
  ...
}

Sorry, wenn das jetzt etwas viel war ;)
 
Zuletzt bearbeitet:
Hallo

Ja, das Ganze ist nur ein Test, damit ich etwas mehr Erfahrung für mein späteres Vorhaben habe.

Mein Ziel ist es, zu überprüfen ob die Zugangsdaten stimmen (Danke das mit der MySQL Injection habe ich noch vergessen). Verschlüsselung spielt jetzt eben für die Tests noch keine Rolle ;)

Werde deinen Code gleich überprüfen und meinen anpassen. Dank dir für die Tipps ;)

Edit
Geht jetzt Alles. Vielen Dank
 
Zuletzt bearbeitet:
Zurück