Loginscript | User bleibt nicht eingeloggt

So habe das Script geschrieben:
PHP:
<?php
$sql = "SELECT ID,Name,PW FROM user WHERE Name='".$_POST['User']."' AND PW=md5('".$_POST['password']."')"; 

$result = mysql_query($sql) OR die(mysql_error());

if(isset($_POST['User'],$_POST['password'],$_POST['submit'])){
	session_start();
	if(mysql_num_rows($result)>0){
		$row = mysql_fetch_array ($result);
		$_SESSION["user_id"] = $row["ID"]; 
		$_SESSION["user_nickname"] = $row["Name"]; 

		echo '<br>Hallo: <b>'.$_SESSION["user_nickname"].'</b><br>';}
	else{
		echo "<br>User und PW stimmen nicht überein!!! <br><br>";}}
		
if(!isset($_SESSION["user_nickname"])){
echo '<table border="0" margin="0" cellspacing="0" cellpadding="0">
		<tr>
			<td><form action="?section=login" method="post"><input value="User" width="6" type="text" name="User" id="User" class="input"></td>
			<td><input value="Passwort" width="6" type="password" name="password" id="password" class="input"></td>
			<td><input type="image" src="images/buttons/login.jpg" name="submit" value="Login"></td>
			<td><input type="image" src="images/buttons/forget.jpg" name="forget" value="Login Vergessen?"></form></td>
		</tr>
		 </table><br>';}
?>

Also er soll das Hallo $_SESSION["user_nickname"] solange anzeigen bis die Session abgelaufen ist, also praktisch eingeloggt bleiben. Und erst wenn die Session abgelaufen ist soll er das Formaular anzeigen. Aber i-wie bekmm ich es net hin ... :(
 
Du musst Deine Session gleich am Anfang starten, sonst wird das nichts.
 
also das einloggen an sich klappt ja. Nur wenn ich auf ne andere Seite wechsel, zeigt er das Formular wieder an, obwohl der User eigentlich eingeloggt sein sollte...
 
Wie geschrieben Du musst Deine Session am Anfang starten, und das in jedem File.

Deine Session, wird ja nur gestartet wenn sich der Benutzer einloggt, also in die IF Abfrage kommt.

PHP:
<?php
session_start(); // Hier mußt Du Deine Session starten.
//Du musst in jeder Datei, wo Deine Session gültig sein soll, session_start() aufrufen.

$sql = "SELECT ID,Name,PW FROM user WHERE Name='".$_POST['User']."' AND PW=md5('".$_POST['password']."')"; 

$result = mysql_query($sql) OR die(mysql_error());

if(isset($_POST['User'],$_POST['password'],$_POST['submit'])){
    //session_start(); // Dass muss hier weg!!!
    if(mysql_num_rows($result)>0){
        $row = mysql_fetch_array ($result);
        $_SESSION["user_id"] = $row["ID"]; 
        $_SESSION["user_nickname"] = $row["Name"]; 

        echo '<br>Hallo: <b>'.$_SESSION["user_nickname"].'</b><br>';}
    else{
        echo "<br>User und PW stimmen nicht überein!!! <br><br>";}}
        
if(!isset($_SESSION["user_nickname"])){
echo '<table border="0" margin="0" cellspacing="0" cellpadding="0">
        <tr>
            <td><form action="?section=login" method="post"><input value="User" width="6" type="text" name="User" id="User" class="input"></td>
            <td><input value="Passwort" width="6" type="password" name="password" id="password" class="input"></td>
            <td><input type="image" src="images/buttons/login.jpg" name="submit" value="Login"></td>
            <td><input type="image" src="images/buttons/forget.jpg" name="forget" value="Login Vergessen?"></form></td>
        </tr>
         </table><br>';}
?>
 
Fehlermeldung ?
Das mit dem eingeloggt kannste ganz einfach regeln in dem du if abfrage machst, ob eine Session gesetzt ist.
PHP:
session_start()
if ( $_SESSION['id'] ) {
//ganz viel toller Inhalt
} else { 
    echo 'Bitter erst <a href="login.php">einloggen</a>'
}
 
Also das klappt jetzt so wie ich es wollte.

Nur hat es einen Markel, wenn ich mich auslogge un erneut einlogge muss ich mich sozusagen zwei mal einloggen, und erst dann zeigt der mir an "Hallo <nick>" etc...

woran kann das liegen? und könnte vllt jemand mal drüber blicken und vllt verbesserungsvorschläge machen?!

PHP:
<?php
session_start(); 
if(isset($_REQUEST['action'])=="logout"){
		unset($_SESSION['user_id']);
		session_destroy();}
if(isset($_SESSION['user_id'])) {
		echo '<table border="0" margin="0" cellspacing="0" cellpadding="0">
		<tr>
			<td>Willkommen,</td>
			<td> '.$_SESSION['user_nickname'].'!</td>
        </tr>
        <tr>
        	<form action="?section=login&action=logout" method="post">
        		<td><input type="image" src="images/buttons/logout.jpg" name="submit" value="Login"></td>
        	</form>
        	<form action="?section=profile" method="post">
        		<td><input type="image" src="images/buttons/edit_profile.jpg" name="submit" value="Login"></td>
            </form>
        </tr>
         </table><br>';} 
else { 
		echo '<table border="0" margin="0" cellspacing="0" cellpadding="0">
		        <tr>
		            <form action="?section=Login" method="post">
		            	<td><input value="User" width="6" type="text" name="User" id="User" class="input"></td>
			            <td><input value="Passwort" width="6" type="password" name="password" id="password" class="input"></td>
			            <td><input type="image" src="images/buttons/login.jpg" name="submit" value="Login"></td>
			            <td><input type="image" src="images/buttons/forget.jpg" name="forget" value="Login Vergessen?"></td>
			        </form>
		        </tr>
		         </table><br>';}

if(isset($_POST['User'],$_POST['password'],$_POST['submit'])){
	$sql = "SELECT ID,Name,PW FROM user WHERE Name='".$_POST['User']."' AND PW=md5('".$_POST['password']."')"; 
	$result = mysql_query($sql) OR die(mysql_error());

    if(mysql_num_rows($result)>0){
        $row = mysql_fetch_array ($result);
        $_SESSION["user_id"] = $row["ID"]; 
        $_SESSION["user_nickname"] = $row["Name"];}
    else{
        echo "<br>User und PW stimmen nicht überein!!! <br><br>";}}
?>
 
Hier erstmal der ein wenig verbesserte Code.

PHP:
<?php
session_start();

if (isset($_POST['submit'])) {
	if (isset($_POST['User'], $_POST['password']) && ! empty($_POST['User']) && ! empty($_POST['password']) ) {
	    $sql = sprintf("
					SELECT
						ID,
						Name,
						PW
					FROM
						user
					WHERE
						Name='%s' AND PW=md5('%s')",
					mysql_real_escape_string($_POST['User']),
					mysql_real_escape_string($_POST['password'])
			);
			
	    $result = mysql_query($sql) OR die("Datenbankfehler!");
		$row = mysql_fetch_array($result);

	    if (sizeof($row) > 0) {        
	        $_SESSION["user_id"] = $row["ID"]; 
	        $_SESSION["user_nickname"] = $row["Name"];
		} else {
	        echo "<br>User und PW stimmen nicht überein!!! <br><br>";
		}
	} else {
		echo "<span style='color: #ff0000;'>Bitte geben Sie einen Benutzernamen und ein Passwort ein. </span><br />";
	}
}
 
if ( isset($_REQUEST['action'])=="logout") {
        unset($_SESSION['user_id']);
        session_destroy();
}

if (isset($_SESSION['user_id'])) {
        echo '<table border="0" margin="0" cellspacing="0" cellpadding="0">
        <tr>
            <td>Willkommen,</td>
            <td> '.$_SESSION['user_nickname'].'!</td>
        </tr>
        <tr>
            <form action="?section=login&action=logout" method="post">
                <td><input type="image" src="images/buttons/logout.jpg" name="submit" value="Login"></td>
            </form>
            <form action="?section=profile" method="post">
                <td><input type="image" src="images/buttons/edit_profile.jpg" name="submit" value="Login"></td>
            </form>
        </tr>
         </table><br>';
} else { 
        echo '<table border="0" margin="0" cellspacing="0" cellpadding="0">
                <tr>
                    <form action="?section=Login" method="post">
                        <td><input value="User" width="6" type="text" name="User" id="User" class="input"></td>
                        <td><input value="Passwort" width="6" type="password" name="password" id="password" class="input"></td>
                        <td><input type="image" src="images/buttons/login.jpg" name="submit" value="Login"></td>
                        <td><input type="image" src="images/buttons/forget.jpg" name="forget" value="Login Vergessen?"></td>
                    </form>
                </tr>
                 </table><br>';
}
?>

Die Überprüfung, ob ein Login gültig ist oder nicht, mußt gleich am Anfang der Seite machen. Du schickst ja die Daten ab, und zeigst dann erst wieder den HTML Teil an und danach machst Du erst die überprüfung. Was natürlich dazu führt, dass Du nicht in die IF-Abfrage kommst weil die Session Vars zu diesem Zeitpunkt noch nicht existieren.
 
Warum nicht so:
PHP:
"... WHERE Name='%s' AND PW='%s'",
         mysql_real_escape_string($_POST['User']),
         md5($_POST['password'])
 
Danke für die Zahlreichen Hilfen. Aber eine Frage habe ich noch. kann man das eventuell so machen, das man alle User anzeigt die momentan eingeloggt sind?! Und wieviele Minuten sie auf der Seite schon verbracht haben?!
 
Willst du nen fertiges Skript, oder wie ?! ;)
Überleg, was du genau haben willst. Mit MySQL, oder ohne.
Ob du das beim Login machst, oder seperat.
Immer wieder zu empfehlen ist das Quakenet PHP-Tutorial. Steht zwar nichts direkt über ein Useronline-Skript drinne, aber gibt jede menge Anregungen ;).


0wnZ
 
ja das benutze ich ja ^^ meiner Meinung nachn sehr gutes Tutorial. Und um auf deine Frage zurückzukommen ich möchte nicht son fertig gebasteltes Script, da is ja der Lerneffekt weg. Nur was mir fehlt sind son paar Gedanken oder innovative Ideen.

Ich hab ne Idee... ich könnte doch rein theoretisch ne neue Zeile Anlegen inner DB (Eingeloggt) und beim Einloggen sie auf 1 setzten und beim ausloggen auf 0. Und sie dann seperat inner Statusbar ausgeben lassen, oder?! *kling* Idee xDD

Und das mit den Minuten ist eig. auch simpel. Timestamp nehmen vom einloggen, speichern. Timestamp nehmen beim ausloggen und dann die Differenz bilden dann hat man wie lange er auf der Seite war, und dann inne DB zu den anderen Minuten addieren x)
 
Und was ist, wenn einfach ne Session abläuft ?
D.h. einer muss zum Essen, lässt den Browser offen. Kommt nach 1 Stunde wieder, will dann sein Profil bearbeiten und wird dann, weil die Session abgelaufen ist, auf Die Loginseite verwiesen. Trotzdem wird der User die ganze Zeit als eingeloggt angezeigt.
 
Dann baut man eine if-schleife ein, welche die alten Sessions aus der DB-Tabelle löscht...
 
Zurück
Oben