| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

02-05-2009, 08:26
|
|
Skywalker031
Registrierter Benutzer
|
|
Registriert seit: Apr 2009
Ort: Kassel
Beiträge: 13
|
|
Loginscript: Login geht nicht, trotz richtiger Zugangsdaten
Hallo allerseits,
ich habe im Web ein Loginscript aufgestöbert
und dies ein wenig meinen Ansprüchen angepasst.
Nun passiert folgendes:
Der User registriert sich, wird vom Admin freigeschaltet,
steht in der db auch richtig drin (soweit ich das sagen kann),
loggt sich dann mit seinem Usernamen und
Userpasswort (Testuser / 1234567) ein und
bekommt nur die Nachricht, dass Username
oder Passwort falsch ist.
Ich habe mir den Code mehrfach angesehen und
überlegt woran es liegen könnte, doch ich kann
keinen Fehler sehen.
PHP-Code:
<?
echo "<center>";
if (isset($_POST["submit"])) {
//wenn submit button betätigt...
$username = $_POST["username"];
//speichere eingegebenen Usernamen in Variable
$passwort = md5($_POST["passwort"]);
//speichere eingegebenes Passwort in
//Varaible und verschlüssele es mit md5()
$user = mysql_fetch_object(mysql_query("SELECT id, username, passwort,
aktiv FROM benutzerdaten WHERE username='" . $username . "'"));
//userdaten aus datenbank holen
if ($username == "" or $passwort == "d41d8cd98f00b204e9800998ecf8427e") {
echo "<b>Du hast nicht alle Felder ausgefüllt!</b>";
//felder aus inhalt überprüfen, wenn leer error ausgeben (Hinweis:
//bei passwort steht so eine zeichenfolge, weil mit md5 auch leerer
//inhalt verschlüsselt wird
} elseif ($user->aktiv == "0") {
echo "<b>Dein Account muß erst noch freischaltet werden, bevor
du dich einloggen kannst!<br>Benachrichtige bitte den Vorstand.</b>";
//überprüfen ob account mit bestätigungslink freigeschaltet wurde,
//wenn nicht error ausgeben
} elseif ($username == $user->username && $passwort == $user->passwort) {
//daten überprüfen, wenn richtig...
$_SESSION["id"] = $user->id;
//registriere die sesson id, mit der ID des users
header("Location: main.php");
//leite zu main.php weiter
exit;
//ab hier tu nix mehr ^^
} else {
//wenn nicht richtig...
echo "<b>Du hast einen falschen Nutzernamen oder ein falsches
Kennwort eingegeben!</b>";
//gib einen error aus
}
}
echo "</center>";
?>
Die Daten die in der db stehen:
id | username | passwort | aktiv
25 | Testuser | fcea920f7412b5da7be0cf42b8c93759 | 1
Vielleicht sieht einer von Euch, wo der Fehler sich versteckt. Vielleicht ist der Fehler ja schon drin gewesen,
bevor ich an dem Script etwas verändert habe.
Daten und Fakten vom Server ( phpinfo)
__________________
lg
Stefan
Geändert von Skywalker031 (02-05-2009 um 12:24 Uhr)
|

02-05-2009, 09:19
|
|
asp2php
Banned
|
|
Registriert seit: Feb 2004
Beiträge: 11.746
|
|
Ändere die Zeile in:
elseif ($username == $user->username && $passwort == $user->passwort)
Auch schon $user->username und $user->passwort zur Kontrolle ausgegeben?
|

02-05-2009, 09:46
|
|
Skywalker031
Registrierter Benutzer
|
|
Registriert seit: Apr 2009
Ort: Kassel
Beiträge: 13
|
|
Hi,
also habe die änderung durch "&&" gemacht, aber hat sich
nichts durch geändert, es kommt immer noch die Fehlermeldung
das Username oder PW falsch sei.
Was meinst du mit
Zitat:
|
Auch schon $user->username und $user->passwort zur Kontrolle ausgegeben?
|
das verstehe ich nicht.
Ich muss auch dazu sagen, dass ich in Sachen PHP-Programmierung
ein totaler Anfänger bin und mich noch nicht wirklich auskenne.
__________________
lg
Stefan
|

02-05-2009, 10:18
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Warum lernst du dann nicht die Grundlagen oder machst ein paar Tutorials?
Lass dir alle Variablen, die du verwendest, mit var_dump() ausgeben und überprüfe ob sie stimmen.
Lass dir einen eventuellen MySQL Fehler mit mysql_error() ausgeben.
Und rück deinen Code ein, damit man sieht, was zu welcher IF-Bedingung gehört.
Geändert von h3ll (02-05-2009 um 10:20 Uhr)
|

02-05-2009, 11:04
|
|
Skywalker031
Registrierter Benutzer
|
|
Registriert seit: Apr 2009
Ort: Kassel
Beiträge: 13
|
|
Ich habe nun mal das mit dem var_dump()
probiert
PHP-Code:
if (isset($_POST["submit"])){
//wenn submit button betätigt...
$username = $_POST["username"];
//speichere eingegebenen Usernamen in Variable
$passwort = md5($_POST["passwort"]);
//speichere eingegebenes Passwort in Varaible und verschlüssele es mit md5()
echo "eingegebener Username:";
var_dump($username);
echo "<br>unverschl. Passwort:";
var_dump($_POST["passwort"]);
echo "<br>verschl. Passwort:";
var_dump($passwort);
echo "<br>";
$user=mysql_fetch_object(mysql_query("SELECT id, username, passwort, aktiv
FROM benutzerdaten WHERE username='".$username."'"));
//userdaten aus datenbank holen
echo "db-Fehlermeldung:";
mysql_error();
echo "<br><br>";
und bekomme nach dem Login-Versuch
folgende Meldung:
eingegebener Username:string(8) "Testuser"
unverschl. Passwort:string(7) "1234567"
verschl. Passwort:string(32) "fcea920f7412b5da7be0cf42b8c93759"
db-Fehlermeldung:
Sieht alles korrekt aus. Die db meldet keinen Fehler.
Was das mit den Grundlagen angeht und den Tutorials,
das hab ich mal vor langer Zeit gemacht, hat mir aber
nicht wirklich geholfen.
__________________
lg
Stefan
|

02-05-2009, 11:11
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Und welche Werte liefert das Query?
|

02-05-2009, 12:05
|
|
Skywalker031
Registrierter Benutzer
|
|
Registriert seit: Apr 2009
Ort: Kassel
Beiträge: 13
|
|
nun habe ich noch folgenden Code hinzugefügt:
PHP-Code:
$user=mysql_fetch_object(mysql_query
("SELECT id, username, passwort, aktiv
FROM benutzerdaten WHERE username='".$username."'"));
//userdaten aus datenbank holen
echo "db-Fehlermeldung:";
mysql_error();
echo "<br>";
echo "query:";
var_dump($user);
echo "<br>";
daraufhin kam folgende Ausgabe:
db-Fehlermeldung:
query:bool(false)
was genau heisst das?
also eine db-Fehlermeldung kam nicht,
aber bei query eben diese "bool(false)"
__________________
lg
Stefan
|

02-05-2009, 12:08
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Da fehlt eine }. An welcher Stelle darfst du selber herausfinden. So gewöhnst du dir vielleicht, deinen Code vernünftig einzurücken.
|

02-05-2009, 12:25
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Eine Klammer?
Das FALSE kommt hier her:
Zitat:
|
Liefert ein Objekt mit Eigenschaften, die den Feldern des geholten Datensatzes entsprechen, oder FALSE wenn keine weiteren Datensätze vorhanden sind.
|
Aus: http://de3.php.net/manual/de/functio...tch-object.php
|

02-05-2009, 12:30
|
|
Skywalker031
Registrierter Benutzer
|
|
Registriert seit: Apr 2009
Ort: Kassel
Beiträge: 13
|
|
@onemorenerd:
Ich hab nun oben in meinem ersten Post,
den Code gänzlich überarbeitet, so das
er (hoffentlich) eingerückt ist.
(Nachtrag: Beim formatieren des Codes hat mir
dieses Tool geholfen)
Allerdings die } die da fehlen soll, habe
ich dadurch dennoch nicht gefunden.
Die } von
PHP-Code:
if (isset($_POST["submit"])) {
endet ganz unten bei
PHP-Code:
}
echo "</center>";
?>
die von
PHP-Code:
if ($username == "" or $passwort ==
"d41d8cd98f00b204e9800998ecf8427e") {
wird bei
PHP-Code:
} elseif ($user->aktiv == "0") {
unterbrochen und fortgesetzt
diese wiederum wird durch
PHP-Code:
} elseif ($username == $user->username &&
$passwort == $user->passwort) {
erneut unterbrochen und fortgesetzt,
welche wiederum durch
unterbrochen und fortgesetzt wird.
diese wird dann bei
PHP-Code:
}
}
echo "</center>";
geschlossen.
Also wo fehlt da noch eine }?
@combie:
Und was heisst das genau?
Das ausser 2 Datensätzen keine in der DB sind?
Denn genau soviele Datensätze sind in der DB.
Oder das keine Datensätze zum suchen da sind?
ich blick da einfach nicht durch!
Für Euch scheint es einfach zu sein,
für mich jedoch ist es jedesmal erneut
ein echter Kampf... dabei bin ich eigentlich
gar nicht so schwer von Begriff... *kopfkratz*
__________________
lg
Stefan
Geändert von Skywalker031 (02-05-2009 um 13:06 Uhr)
|

02-05-2009, 12:41
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Zitat:
@combie:
Und was heisst das genau?
Das ausser 2 Datensätzen keine in der DB sind?
Denn genau soviele Datensätze sind in der DB.
Oder das keine Datensätze zum suchen da sind?
|
Nein, das heißt:
Deine Abfrage hat keinen Datensatz gefunden!
PS:
Und denke auch an SQL-Injections
|

02-05-2009, 12:46
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Ich kann da nicht mehr zuschauen.
PHP-Code:
<?php
if (isset($_POST['submit'])) {
$username = trim($_POST['username']);
$passwort = trim($_POST['passwort']);
if ($username == '' || $passwort == '') {
echo 'Geben Sie Username und Passwort ein.';
} else {
$sql = "
SELECT
id, username, passwort, aktiv
FROM
benutzerdaten
WHERE
username = '%s' AND passwort = '%s'
LIMIT
1
";
$result = mysql_query(sprintf($sql, mysql_real_escape_string($username), md5($passwort));
if (!$result) {
die('Invalid query: ' . mysql_error());
}
$row = mysql_fetch_assoc($result);
if (!$row) {
echo 'Username oder Passwort sind nicht korrekt.';
} elseif (!$row['aktiv']) {
echo 'Login muss aktiviert werden.';
} else {
echo 'Login erfolgreich.';
}
}
}
?>
|

02-05-2009, 12:55
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Zitat:
Original geschrieben von Skywalker031
... den Code gänzlich überarbeitet, so das er (hoffentlich) eingerückt ist.
Allerdings die } die da fehlen soll, habe ich dadurch dennoch nicht gefunden.
|
Dann hat wohl doch keine gefehlt. Jetzt sieht der Code aber viel übersichtlicher aus und ich seh auch auf den ersten Blick, dass ich mich bzgl. der Klammer geirrt habe. Mea culpa.
Du verwendest $username in der Query, prüfst aber erst danach, ob diese Variable überhaupt etwas sinnvolles enthält.
Code:
wenn Formular abgeschickt {
wenn alle felder ausgefüllt {
Userdaten aus DB laden
wenn User geladen werden konnte {
wenn User aktiv {
einloggen;
weiterleiten;
} sonst Fehlermeldung "Erst freischalten lassen";
} sonst Fehlermeldung "False Eingabe";
} sonst Fehlermeldung "Nicht alles ausgefüllt";
}
BTW: Kommentare stehen normalerweise vor dem Code, auf den sie sich beziehen.
EDIT: Schade, ich war zu langsam. Aber mit der besseren Absicht.
Geändert von onemorenerd (02-05-2009 um 13:00 Uhr)
|

02-05-2009, 13:00
|
|
Skywalker031
Registrierter Benutzer
|
|
Registriert seit: Apr 2009
Ort: Kassel
Beiträge: 13
|
|
@combie:
Aha, wieso findet er mit diesem Code keinen Datensatz,
obwohl doch 2 Datensätze vorhanden sind?
@h3ll:
Ich habe nun deinen umgeschriebenen Code
anstelle des alten ersetzt. Wenn man nun die
Seite aufruft, bekomme ich einen HTTP 500 Internen
Serverfehler angezeigt - sprich die Seite lässt sich
nicht aufrufen
@onemorenerd:
Das mit den Kommentaren, und wie der Code aufgebaut
ist, von wegen was, wann und wo und in welcher Reihen-
folge, kam nicht von mir, sondern war schon so von Anfang an.
@all:
Ich hatte im ersten Post ja schon geschrieben,
dass ich das Grundscript aus dem Web habe.
An der Index, hatte ich ausser ein paar "Echo"-Zeilen
nichts verändert - also die index war so schon
als ich sie bekommen habe.
__________________
lg
Stefan
Geändert von Skywalker031 (02-05-2009 um 13:03 Uhr)
|

02-05-2009, 13:06
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Zitat:
Original geschrieben von Skywalker031
[B]@combie:
Aha, wieso findet er mit diesem Code keinen Datensatz,
obwohl doch 2 Datensätze vorhanden sind?
|
Da gibts genau 2 Möglichkeiten:
1. In der DB steht nicht das, was du erwartest, was da drin stehen sollte.
2. Im Query steht nicht das, was du erwartest, was da drin stehen sollte.
Also eine einfache Differenz zwischen IST Zustand und Erwartungshaltung.
Geändert von combie (02-05-2009 um 13:08 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|