PHP => Sessions

Hola,

ich versuch mich gerade an Sessions in Verbindung mit einer MYSQL-Datenbankabfrage, aber ich komm hier nicht so wirklich weiter:

Die Datenbank hat den Namen "atciss_db" , in dieser ist ein Table Namens "user" definiert. In diesem Table sind 3 Spalten Namens "id, username und password". Diese enthalten die Werte "1, admin und admin".

Nun habe ich eine index.php und eine login.php, welche wie folgt aussehen:

Code:
[index.php]

<?php
    session_start(); 
    $_SESSION["auth"]=1;    // Neue Variable wird angelegt (authenticated) und diese wird auf 1 gesetzt. D.h. der User hat das Recht sich einzuloggen
?>

<form name="UserLogin" method="post" action="login.php">
<input type="hidden" name="projekt" value="0">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="login" value="Login">
</form>



[login.php]

<?php
    session_start();                      // Session wird übernommen
    if ($_SESSION["auth"]==1)    // Abfrage, ob der User das Recht hat sich einzuloggen
    {
        @mysql_connect("localhost", "root", "");    // Aufbau der Datenbankverbindung und Abfrage, ob der User existiert, bis Zeile 29
        @mysql_select_db("atciss_db");
        $result=@mysql_query("select * from user where username='".addslashes($_POST["username"])."' and password='".$_POST["password"]."'");
        $row=mysql_fetch_array($result);

        if($row["id"])
        $_SESSION["auth"]=2;    // Falls der User existiert wird authenticated auf 2 gesetzt und der User ist eingeloggt
        else
        echo "Username oder Passwort inkorrekt";    // Falls der User nicht existiert wird eine Fehlermeldung ausgegeben
    }


    if ($_SESSION["auth"]==0)    // Sollte authenticated in der Session 0 sein, heißt das der User ist nicht eingeloggt. Für diesen Fall wird die Meldung ausgegeben, daß die Session nicht existiert
    {
        echo "Session existiert nicht";
    }


    if ($_SESSION["auth"]==2)
    {
       header("Location:seite2.php");    // URL der Seite, auf die nach dem Einloggen verwiesen werden soll
    }

?>

Ich bekommt hierbei die Meldung, daß der Username oder das Passwort falsch ist. Demnach hat ist irgendwo wohl ein Problem, daß die Daten aus der Datenbank nicht richtig ausgelesen werden.

Btw: Das in Zeile 26 hab ich nur so umständlich geschrieben, weil ich dort zuvor noch ein paar andere Variablen eingebunden hatte

Erstmal soweit, wenn das funktioniert mache ich an den Rest wie die Logout-Prozedur.

So long...

Greetz Evil
 
Original von TheEvilOne
In diesem Table sind 2 Spalten Namens "username und password". Diese enthalten die Werte "admin und admin".

gibt es in der tabelle die spalte "id" ?
steht in der spalte "password" das wort "admin" oder der md5 hash ?
 
Da steht das Passwort "admin" in Lautschrift drin ...

...und _jetzt_ gibts in der Tabelle auch die Spalte ID ;-] ...aber geht leider immer noch nicht.
 
du vergleichst das password mit dem md5 hash und nicht mit dem wort
also schreib entweder den entsprechenden md5 hash bei password in die datenbank oder nimm die md5 funktion aus der select anweisung raus
 
Super, es funktioniert, danke Dir ;-]

Nachtrag: Im Nachhinein stellte ich fest, daß es nun egal ist, was ich eingebe, es funktioniert immer ^^ ...also auch bei falscher Passworteingabe. Ich muß da nochmal drüberschaun...
 
Code:
<?php
    session_start();                      // Session wird übernommen
    if ($_SESSION["auth"]==1)    // Abfrage, ob der User das Recht hat sich einzuloggen
    {
        $conn = @mysql_connect("localhost", "root", ""); // Aufbau der Datenbankverbindung und Abfrage, ob der User existiert, bis Zeile 29
		if($conn) {
		   mysql_select_db("atciss_db", $conn);
		} else {
		   die("Sorry, this service is temporarely unavailable. We have a problem with the database.\n");
		}
        
        $query="select * from user where username='".addslashes($_POST["username"])."' and password='".md5($_POST["password"])."'";
        $result=@mysql_query($query);
        if ( $result AND mysql_num_rows($result)>0) {
	        $row=mysql_fetch_array($result);

	        $_SESSION["auth"]=2;    // Falls der User existiert wird authenticated auf 2 gesetzt und der User ist eingeloggt
        } else {
        	echo "Username oder Passwort inkorrekt";    // Falls der User nicht existiert wird eine Fehlermeldung ausgegeben
		}
    }

    if ($_SESSION["auth"]==0)    // Sollte authenticated in der Session 0 sein, heißt das der User ist nicht eingeloggt. Für diesen Fall wird die Meldung ausgegeben, daß die Session nicht existiert
    {
        echo "Session existiert nicht";
    }


    if ($_SESSION["auth"]==2)
    {
        echo "Hier wird die URL angegeben, welche hinter dem PSw-Schutz liegt";    // URL zu der geheimen Seite per header("Location:URL");
    }

?>

hab mal ein paar aenderungen gemacht.....diese sollten aber bei deinem problem keinen unterschied machen.
ich wuerde jetzt mal behaupten, dass die query keine ergebnisse zurueckgibt. gibt mal mit echo deine query aus und schicke diese per hand an mysql (z.b. commandline oder phpmyadmin), damit du so sehen kannst ob diese auch ein ergebnis bringt.

btw zur zeit versuchst du dein md5 verschluesseltes passwort mit dem cleartextpw in der db zu vergleichen (ev hast du das mitlerweile geaendert). das gibt natuerlich kein ergebnis zurueck.
 
Ich hab die Zeilen in meinem Code oben mal ergänzt, so wie es jetzt bei mir aussieht; ist zwar nicht wirklich _schön_ so, aber für den Augenblick zweckmäßig =)

@soox
Dein Code macht tatsächlich keinen Unterschied, es wird immer noch das Gleiche Problem angezeigt. Ein Ergebnis wird mit dem neuen Code oben im Query auch erzeugt.

mh, wieso fügst Du denn da ein @ ein? $conn = @mysql_connect ?
 
dann vermute ich mal dass es bei dir an der session liegt
nach dem ersten erfolgreichen einloggen ist die $_SESSION["auth"] immer gleich 2 und dadurch kommt es bei allen folgenden logins gar nicht mehr zur db abfrage weil du ja vorher diese abfrage machst
if ($_SESSION["auth"]==1)
deswegen sind nach dem ersten erfolgreichen einloggen, scheinbar alle falschen logins korrekt
also teste das mal jeweils in nem neuen browserfenster oder schreib dir erstmal ne logout funktion (is ja im prinzip nur eine zeile)
 
Da hatte ich mich vorhin wohl irgendwo verschrieben, die Anführungszeichen falsch gesetzt, o.ä. ... aber jetzt funktioniert es einwandfrei mit Deinem Code.

Vielen Dank für Eure Hilfe ;-]
 
wichtig ist einfach das addslashes bei username, da ich dir boese sachen uebergeben kann.

das @ ist dazu da, dass php nichts was den user nicht angeht "ausplaudert"
 
mh, wenn ich die index.php in meine Seite einfügen will (ich hab sie jetzt in start.php umbenannt, um das alles in mein Projekt einzufügen), dann kann ich diese dort nur oberhalb des HTML-Tags einbinden, d.h.:

Code:
<?php
include('start.php');
?>

<html>
<head>
</head>
<body>
...
</body>
</html>

Sobald ich sie allerdings innerhalb der Body-Tags einfüge, bekomm ich Warnungen ("Cannot send session cookie" und "Cannot send session cache limiter") und sobald ich mich einlogge, kommt die Meldung, daß die Session nicht existiert. Aber wie gesagt, oberhalb der HTML-Tags funktioniert es, aber wieso ist das so und weshalb kann ich das nicht unten einfügen?



Zur Info:
Ich hab jetzt noch die logout.php und die authheader.php geschrieben. Die authheader.php füge ich per include in jede Datei ein, welche nur für eingeloggte User erreichbar sein soll:

Code:
[authheader.php]

<?php
    session_start();    // Session wird übernommen

    if ($_SESSION["auth"]!=2)    // Abfrage ob der User eingeloggt ist
    {
        header("Location:index.php");    // Wenn der User nicht eingeloggt ist, wird er auf die index.php verwiesen
        exit;
    }
?>



[logout.php]

<?php
    session_start();
    session_destroy();
?>
Sie wurden erfolgreich ausgeloggt.
 
Original von TheEvilOne
Sobald ich sie allerdings innerhalb der Body-Tags einfüge, bekomm ich Warnungen ("Cannot send session cookie" und "Cannot send session cache limiter") und sobald ich mich einlogge, kommt die Meldung, daß die Session nicht existiert. Aber wie gesagt, oberhalb der HTML-Tags funktioniert es, aber wieso ist das so und weshalb kann ich das nicht unten einfügen?
Original von PHP.net
Note: If you are using cookie-based sessions, you must call session_start() before anything is outputted to the browser.
Quelle: http://de3.php.net/manual/en/function.session-start.php

sr
 
Zurück
Oben