Login mit Sessions funktioniert nicht
morpheuz
- php
0 morpheuz0 wahsaga0 Fabian St.
Hallo,
habe in meinem Login irgendwo einen Fehler. Ich habe das Formular login.php wo ich die daten eingeben muss (user und passwort) wenn man das ausfüllt und nach betätigung des Login Buttons kommt man auf login_a.php wo die daten geprüft werden. Die Daten werden auch richtig übergeben - habe ich mit einer echo ausgabe geprüft. Die Spalten- und Tabellenbenennung in der mySQL-DB stimmen ebenfalls - ich finde absolut den fehler nicht - vielleicht ihr?
+-------------------------------------------+
|login.php |
+-------------------------------------------+
<?php
session_start ();
print "<br>
Bitte loggen Sie sich ein.<br><br>";
if (isset ($_REQUEST["fehler"]))
{
echo "Die Zugangsdaten waren ungültig.";
}
print "<form action='login_a.php' method='post'>
<table border='0'>
<tr>
<td>Benutzername:</td><td>
<input type='text' class='textinput' size='30' name='user'></td></tr><tr>
<td>Passwort:</td><td>
<input type='password' class='textinput' size='30' name='pass'></td></tr>
<tr>
<td> </td><td align='right'><input type='submit' class='submit' value='Login'>
</td>
</tr>
</table>
</form>";
print "Session ID: " . SID;
?>
+-------------------------------------------+
|login_a.php |
+-------------------------------------------+
<?php
// Session starten
session_start ();
require "configs.php";
// Datenbankverbindung aufbauen
$connectionid = mysql_connect ($dbhost, $dbuser, $dbpass);
if (!mysql_select_db ($dbname, $connectionid))
{
die ("Keine Verbindung zur Datenbank");
}
$sql = "SELECT * FROM users WHERE (user like '".$_REQUEST["user"]."') AND (pass = '".md5 ($_REQUEST["pass"])."')";
$result = mysql_query ($sql);
if (mysql_num_rows($result) > 0) {
// Benutzerdaten in ein Array auslesen.
$data = mysql_fetch_array ($result);
// Sessionvariablen erstellen und registrieren
$_SESSION["name"] = $data["name"];
$_SESSION["user"] = $data["user"];
header ("Location: index.php");
}
else {
header ("Location: login.php?fehler=1");
}
?>
+-------------------------------------------+
|Datenbank "users" |
+-------------------------------------------+
id | user | pass | name
----------------------------
1 user1 1234 User 1
2 user2 2345 User 2
3 user3 3456 User 3
----------------------------------------------------
in der login_a.php wird die datei configs.php per require reingerufen, da sind lediglich die Datenbank-Zugangsdaten als Variablen ($dbname etc) drin gespeichert - und die stimmen auch
alle.
Ich hoffe, ich konnte es so deutlich wie möglich machen - Bitte helft mir dabei, sonst werde ich noch verrückt mit den Sessions ;-)
ciao morpheuz
Hallo nochmal,
hatte vergessen zu erwähnen was er bzw. was PHP nicht macht. Nach der Logineingabe springt die Seite direkt auf login_a.php testet die Daten und schickt mich wieder zurück auf die login.php?fehler=1
ciao morpheuz
hi,
$sql = "SELECT * FROM users WHERE (user like '".$_REQUEST["user"]."') AND (pass = '".md5 ($_REQUEST["pass"])."')";
echo sql;
-> copy und paste dieses query-strings -> direkt auf der DB ausführen lassen (administrationsoberfläche oder phpMyAdmin)
ergebnis?
gruß,
wahsaga
hallo,
ergebnis?
habs getestet und habe beim SQL-Statement die md5 Verschlüsselung raus genommen.
Das Ergebnis vor Herausnahme ist folgender:
SELECT * FROM spd_users WHERE (user like 'test') AND (pass = 'asdf')
das ist auch richtig, habs im mySQL Control Center getestet, dann zeigt er mir den Datensatz an.
Er muss allerdings nun die Daten erfolgreich annehmen, da sonst die Fehlermeldung kommen würde, daher denke ich dass ich datenbankprobleme ausschliessen kann.
morpheuz
hi,
habs getestet und habe beim SQL-Statement die md5 Verschlüsselung raus genommen.
warum herausgenommen?
Das Ergebnis vor Herausnahme ist folgender:
SELECT * FROM spd_users WHERE (user like 'test') AND (pass = 'asdf')
das ist auch richtig, habs im mySQL Control Center getestet, dann zeigt er mir den Datensatz an.
ist das passwort in der DB jetzt verschlüsselt oder nicht ...?
gruß,
wahsaga
hallo
ist das passwort in der DB jetzt verschlüsselt oder nicht ...?
nein war es nicht - deswegen habe ich md5 auch rausgenommen. Ich habe jetzt den Fehler denke ich mal herausgefunden - weiß allerdings nicht wie ich es beheben soll.
Problem ist, dass er in der login_a.php nach dem er den test macht, ob der user gültig ist, die SESSION-Werte registriert und in die SESSION-Variablen speichert. Diese scheint er aber nicht weiter an das zu kontrollierende Skript zu übergeben (checkuser.php) das auf jeder seite per include eingebunden wird. Warum keine Ahnung hier noch mal die login_a.php und das zu kontrollierende Skript:
login_a.php
-------------------------------------------
<?php
// Session starten
session_start ();
require "configs.php";
// Datenbankverbindung aufbauen
$connectionid = mysql_connect ($dbhost, $dbuser, $dbpass);
if (!mysql_select_db ($dbname, $connectionid))
{
die ("Keine Verbindung zur Datenbank");
}
$sql = "SELECT * FROM users WHERE (user like '".$_REQUEST["user"]."') AND (pass = '".$_REQUEST["pass"]."')";
$result = mysql_query ($sql);
if (mysql_num_rows ($result) > 0)
{
// Benutzerdaten in ein Array auslesen.
$data = mysql_fetch_array ($result);
// Sessionvariablen erstellen und registrieren
$_SESSION["id"] = $data["id"];
$_SESSION["name"] = $data["name"];
$_SESSION["user"] = $data["user"];
header ("Location: index.php?modul=normal");
}
else
{
print $sql ."<br>";
print $_REQUEST["user"]. " und " . $_REQUEST["pass"]. " und SessionID: " .SID;
//header ("Location: login.php?fehler=1");
}
?>
----------------------------------------
checkuser.php
----------------------------------------
<?php
session_start ();
if (!isset ($_SESSION["id"]))
{
header ("Location: login.php");
}
?>
----------------------------------------
warum gibt er die Variable id nicht weiter?
ciao morpheuz
Hallo zusammen,
habe den Fehler gefunden - es liegt daran, dass die SESSION kein Cookie ablegt, ich habe das Formular mit der SID angehängt uns siehe da - es hat funktioniert!
Danke für eure Hilfe!
ciao morpheuz
servus nochmal,
der fehler liegt denke ich mal an der überprüfung auf den restlichen Seiten ob die SESSION noch existiert.
<?php
session_start ();
if (!isset ($_SESSION["user"]))
{
header ("Location: login.php");
}
?>
ist das falsch ?
ciao morpheuz
Hi morpheuz!
Das wird zwar nicht der Fehler sein, aber ersetze die relative URL in
header ("Location: index.php");
doch durch header ("Location: http://www.mysite.com/index.php");
da auf Location immer eine absolute URL folgen muss.
---------------------------------------------------------
Grüße,
Fabian St.
hi fabian,
doch durch header ("Location: http://www.mysite.com/index.php");
ist aber lokal auf dem rechner
ciao morpheuz
Hi,
doch durch header ("Location: http://www.mysite.com/index.php");
ist aber lokal auf dem rechner
das spielt keine Rolle. Wenn es bei dir lokal auf dem Rechner liegt, muss es korrekt dann eben z.B.
header ("Location: http://localhost/index.php");
heissen.
Grüsse
Frankie
Moin!
das spielt keine Rolle. Wenn es bei dir lokal auf dem Rechner liegt, muss es korrekt dann eben z.B.
header ("Location: http://localhost/index.php");
Schlauer ist es, den verwendeten Hostnamen aus $_SERVER['HTTP_HOST'] zu nehmen. Dann muß man diese Redirects vor dem Hochladen nicht mehr an den eigentlichen Server anpassen.
Außerdem: Was ist, wenn "localhost" gar nicht der eingerichtete virtuelle Host der Testdomain ist? :-P
- Sven Rautenberg
Hi Sven,
Schlauer ist es, den verwendeten Hostnamen aus $_SERVER['HTTP_HOST'] zu nehmen. Dann muß man diese Redirects vor dem Hochladen nicht mehr an den eigentlichen Server anpassen.
Ja, das wäre besser.
Außerdem: Was ist, wenn "localhost" gar nicht der eingerichtete virtuelle Host der Testdomain ist? :-P
Das stimmt, daher schrieb ich auch "[...] z.B. [...] localhost [...]".
Grüsse
Frankie