[PHP]User bleibt nicht eingeloggt

Needa

Mitglied
Hallo,
ich habe ein Loginscript, dass auf der index-Seite per include-Befehl in eine Navigationsleiste eingefügt wird. Dort soll sich dann auch alles abwickeln, also wenn der User eingeloggt ist, soll er sein Profil ändern können, usw.! Alles kein Problem, nur wenn ich jetzt beispielsweise auf einen Link klicke, ist in der User-Navi (also dort wo der User sich einloggt, usw.) ist jetzt wieder das Loginfenster.
Habe schon in mehreren Threads im Forum nachgeschaut, bin aber nicht wirklich schlau geworden.

Hier der Code der index.php:
PHP:
<?php 
session_start();
require('config.inc.php');
?>
<html>
  <head>
   <title>community Page</title>
   <link href="styles.css" rel="stylesheet" type="text/css">
   <script language="JavaScript"> 
function popup(URL) { 
   window.open(URL, 'popup', 'toolbar=0, scrollbars=1, location=0, statusbar=0, menubar=0, resizable=0, width=650, height=400, left=100, top=100'); 
} 
</script>
  </head>
<body>
<table width="600" border="0" style="border: 1px solid #000000" height="80">
  <tr>
    <td><div align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="1">« Banner »</font></div></td>
  </tr>
</table>
<br>
<table width="600" border="0" style="border: 1px solid #000000">
  <tr>
    <td width="100" valign="top">
	<font face="Verdana, Arial, Helvetica, sans-serif" size="1">» Navigation
	
	<br><a href="?page=news">News</a><br>
	
	<strike>User</strike>
	
	</font>
	</td>
    <td width="400" valign="top" style="border-right: 1px solid #000000; border-left: 1px solid #000000">
	<?php 
	switch($page){
	case "news": include("news.php"); break;
	case "user": include("user.php?step=5"); break;
	default: include("news.php"); break;
	}
	?>
	</td>
    <td width="100" valign="top">
	 
	<?php 
	switch($navi){ 
	case "user": include("user.php"); break;
    default: include("user.php"); break;
	} 
   
	?>
	</td>
  </tr>
</table>

</body>
</html>

und hier die user.php, die included wird:
PHP:
<?
session_start();
if(!isset($step)) { $step = "0"; } 
if($step == "0") { 
?>
<?php 
if (isset ($_REQUEST["fehler"])) 
{ 
  echo "Die Zugangsdaten waren ungültig."; 
} 
?> 
<form action="" method="post">
<table width="80" border="0" style="border: 1px solid #000000">
  <tr>
    <td><font face="Verdana, Arial, Helvetica, sans-serif" size="1">Nickname:</font></td>
  </tr>
  <tr>
    <td><input type="text" name="name" size="10" maxlenght="20"></td>
  </tr>
  <tr>
    <td><font face="Verdana, Arial, Helvetica, sans-serif" size="1">Passwort:</font></td>
  </tr>
  <tr>
    <td><input type="password=" name="pwd" size="10" maxlenght="20"></td>
  </tr>
  <tr>
    <td><input type="submit" value="Log-On"><input name="step" type="hidden" value="1"></td>
  </tr>
</table>
</form>
<?php } elseif ($step == "1") { ?>
<?php
$connectionid = mysql_connect ($sql_host, $sql_user, $sql_pass); 
if (!mysql_select_db ($sql_dbname, $connectionid)) 
{ 
  die ("Keine Verbindung zur Datenbank"); 
} 

$sql = "SELECT ". 
    "Id, Nickname, Privileg ". 
  "FROM ". 
    "user ". 
  "WHERE ". 
    "(Nickname like '".$_REQUEST["name"]."') AND ". 
    "(Kennwort = '".md5 ($_REQUEST["pwd"])."')"; 
$result = mysql_query ($sql); 

if (mysql_num_rows ($result) > 0) 
{ 
  // Benutzerdaten in ein Array auslesen. 
  $data = mysql_fetch_array ($result); 
  $logged_in = "1";
  // Sessionvariablen erstellen und registrieren 
  $_SESSION["user_id"] = $data["Id"]; 
  $_SESSION["user_nickname"] = $data["Nickname"]; 
  $_SESSION["user_privileg"] = $data["Privileg"];
  $_SESSION["logged_in"] = $logged_in;
   
  echo "<script language='javascript'>
  document.location.href = '?navi=user&step=2'; </script>";
} 
else
{ 
 echo "<script language='javascript'>
  document.location.href = '?navi=user&step=0&fehler=1'; </script>";
} 
?>
<?php } elseif ($step == "2") { ?>
<?php include('checkuser.php'); ?>
<?php 
if ($_SESSION["logged_in"] = "1") {
?>
<font face="Verdana, Arial, Helvetica, sans-serif" size="1">BenutzerId: <?php echo $_SESSION["user_id"]; ?><br> 
Nickname: <?php echo $_SESSION["user_nickname"]; ?><br> 
Privileg: <?php echo $_SESSION["user_privileg"]; ?><br></font>
<hr> 
<font face="Verdana, Arial, Helvetica, sans-serif" size="1"><a href="javascript:popup('edituser?step=0.php')">Profil ändern</a>
<br><a href="?navi=user&step=3">Logout</a></font>
<?php 
if ($_SESSION["user_privileg"] == "admin") {
echo "<br><font face='Verdana, Arial, Helvetica, sans-serif' size='1'><a href='?page=news'>News post/edit</a></font>"; } 
?>
<?php } else { echo "<script language='javascript'>
  document.location.href = '?navi=user&step=0&fehler=1'; </script>"; } ?>
<?php } elseif ($step == "3") { ?>
<?php 
ob_start (); 
session_start (); 
session_unset (); 
session_destroy (); 
echo "<meta http-equiv='Refresh' content='0;URL=$include_url'>";
ob_end_flush (); 
?> 
<?php } else {} ?>
 
Das ist auch normal das dein Script nicht funktionieren kann. Das Problem liegt in der zweiten Darstellung unten und zwar hast du session_start() das zweite mal zu starten gebracht.

Weitere Info unter: http://de.php.net/manual/de/ref.session.php

Noch ein Tipp, wenn du mit session arbeitest, solltest du das includen wenn möglich beschränken. Vor allem dann, wenn eine Session gestartet werden soll.

Das Problem ist auch möglicherweise so gelagert, das eine erneute Prüfung der bereits vorhandenen Variablen der Session nicht richtig registriert wurden. Aber dazu habe ich dein script nicht genau genug angesehen.

Ein weitere Teil ist auch unklar:

<?
session_start();
if(!isset($step)) { $step = "0"; }
if($step == "0") {
?>
<?php

was machen die <? und ?> und <?php? - ausser das da was ist was nicht sein muss ;)

hier das selbe noch mal:
<?php } elseif ($step == "1") { ?>
<?php

wieso machst du das?

?>
<?php } elseif ($step == "2") { ?>
<?php include('checkuser.php'); ?>
<?php

hier liegt dein Fehler:

<?php
ob_start ();
session_start ();
session_unset ();
session_destroy ();
echo "<meta http-equiv='Refresh' content='0;URL=$include_url'>";
ob_end_flush ();
?>
<?php } else {} ?>

Das geht absolut nicht am Ende einer Datei!
 
wieso soll das bitte nicht am ende einer datei gehen?! es funktioniert doch omg.. ausserdem will ich eine antwort auf meine frage, keine layoutverbesserungen!
 
Würdest du den Text richtig lesen statt dich angesprochen zu fühlen, weil dein Code unsauber ist, wüsstest du das deine Antwort bereits enthalten ist.

Wenn du dennoch der Meinung bist, das dein Code läuft (und ich behaupte hier das dies nicht so ist, weil du sonst kein Sessionproblem hättest), les einfach mal die Bedingungen für eine sauber verlaufende Session:

http://www.dclp-faq.de/ch/ch-version4_session.html
http://www.dclp-faq.de/q/q-fehler-session-cookie.html

Besonders im zweiten Link enthaltene Texte sollten dir weiteren Aufschluß bieten.

Und wenn in deinem Code einfach <?php und ?> zu viel oder absolut unnötig ist, lass es dir doch sagen. Du sparst dir doch Arbeit und Zeit statt konstruktiver Kritik auch noch negativ zu begegnen. ;) Im übrigen ist das keine Layoutverbesserung, diese sähe noch mal ganz anderst aus ;)
 
Ja, das ist soweit auch ok, wenn ich Zeit habe, werde ich mir die beiden Links auch durchlesen, aber mein Problem liegt ja nicht wirklich an den Sessions, ich kann mich ja ohne Probleme einloggen, und auch nur auf die Pages mit Checkuser-Schutz zugreifen, wenn ich eingeloggt bin bzw. die Session läuft, ich will nur, dass die elseif-Schleife bei $step = 2, also der Adminbereich, angezeigt bleibt, wenn der User sich eingeloggt hat und auf einen anderen Link klickt. In meinem Script funktioniert das nicht richtig, ich inlcude es ja in die Hauptseite(index.php), da kann sich der user einloggen und wenn er eingeloggt ist soll er beispielsweise sein Profil bearbeiten können, aber wie gesagt, falls er auf einen andereren Link klickt wird wieder das Login-Formular angezeigt.
 
Original geschrieben von SonicBe@m
schreibst du in die anderen files auch immer braf dein session_start(); `?

Die anderen Files werden ja einfach in die index.php included, und in der ist ja ein session_start(); - von daher sollte es ja kein Problem sein.

$step2 wird ja nur ausgeführt, wenn $step1 FALSE ist.

Also stimmt die File rein vom Aufbau her nicht? Wenn ich das richtig verstanden habe soll jetzt in $step0 der geschützte Bereich?

Die Session kann ich einfach per if(isset($_SESSION["user_id"])) überprüfen, oder?
 
Naja, bevor du jetzt in ein wildes raten kommst, denk mal logisch nach.

Du wirst ja eine DB-Abfrage starten ob der User mit Passwort enthalten ist oder nicht?!

Wenn ja setze Cookies, wenn nein zurück zum Logginbereich. Wenn Cookies gesetzt führe auch $step2 aus.


Zu deinen Fragen:
if/else-Aufbau stimmt nicht, kannst du unter $step0 packen wobei auch andere Möglichkeiten offen sind.

Was eine Session angeht, hier noch mal ein Link mit welchem du wohl noch etwas mehr anfangen kannst:
http://ag-kastens.upb.de/lehre/material/skriptsprachen/ws2001/folien/scr_4pack10.pdf

Um das lesen wirst du nicht drumrum kommen ;)
 
So... habe mir jetzt die empfohlenen Seiten durchgelesen, war z.T. ganz informativ :-) ! Danke an dieser Stelle schonmal!

Jetzt habe ich mich also rangesetzt und mein komplettes Script umgeschrieben, es basiert im Moment nur auf Cookies, sollte erstmal auch reichen :O!
Auf jeden Fall spuckt er mir jetzt diesen:


Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in E:\apachefriends\xampp\htdocs\scripte\script_test\login.inc.php on line 17

Fehler aus. Bin ja nicht dumm :-( bzw. ich kann den Fehler bis zum Query was empty zurückverfolgen. Habe dann hier im Forum gesucht, aber bisher war beim Query was empty Fehler immer ein == bei dem SQL-String schuld.
Ist bei mir aber nicht so!
Ich poste einfach mal die Login-Seiten, keine Angst sind nur 2 kurze :-)!

login.inc.php
PHP:
<?php

// Variablen aufbereiten
$benutzer = $_POST["user"];
$passwort = $_POST["pass"];

// Login
 if($_COOKIE["user_id"] != "") {
   echo "<meta http-equiv='Refresh' content='0;URL=user_profile.php'>"; }
   else {
   
   
    $connect = mysql_connect("localhost","root","") or die(mysql_error());
	mysql_select_db("login",$connect);
	$sql =  "select id, user, pass, prev from user where user = '$benutzer' and pass = md5('$passwort')"; }
	
	$result = mysql_query($sql, $connect) or die(mysql_error());
	  if(mysql_num_rows($result) > 0) {
	  
	  $data = mysql_fetch_array($result);
	  
	  setcookie("user_id", $data["id"], time()+3600*24*60);
	  setcookie("user_name", $data["user"], time()+3600*24*60);
	  setcookie("user_priv", $data["priv"], time()+3600*24*60);
	  
	  echo "Daten überprüft,<br>";
	  echo "Cookies wurden gesetzt...<br>";
	  echo "<meta http-equiv='Refresh' content='0;URL=user_profile.php'>";
	  
	  } else { 
	  
	 echo "Daten nicht korrekt!"; }
	

?>
PHP:
<?php 


if (isset ($_REQUEST["fehler"])) 
{ 
  echo "Invalid Userdata."; 
} 
?>
<form action="" method="post">
<input type="text" name="user" value="Needa">
<br><input type="password" name="pass" value="sonicview">
<br><input type="submit" name="submit">
</form>
<?php

if($_POST["submit"]) {
require('login.inc.php');

 }
?>
die login.inc.php wird einfach in die user_login.php included und eben mit $POST["submit"] "aktiviert"..

Hoffe ich hab den Fehler gut genug beschrieben und ihr könnt nochmal helfen !
 
Zurück