Session Login-Script Fehlermeldung !

Hm nur ein paar kleine Fehler, ich habs mal überarbeitet, probiers jetzt nochmal.
PHP:
<?php
session_start();

if ($_POST['user_nick'] && $_POST['user_passwort'])
{ 
  $user_nick = $_POST['user_nick'];
  $user_passwort = $_POST['user_passwort'];
  $sql = "SELECT * FROM users 
              WHERE user_nick = '$user_nick' and user_passwort = '$user_passwort'";
  $result = mysql_query($sql);
  $row = mysql_fetch_assoc($result);
        
  if ($row['user_nick'] == $_POST['user_nick'] && $row['user_passwort'] == $_POST['user_passwort'])
  {
    $status = "Login korrekt! Hallo " . $row['user_nick'];
    $user_id = $_REQUEST['user_id'];
    $_SESSION['user_id'] = $user_id;
    $user_nick = $_REQUEST['user_nick'];
    $_SESSION['user_nick'] = $user_nick;
    header('Location: index.php');
  }
  else 
  {
    $status = "Falsche Login-Daten oder Passwort falsch";
  }
}  
else 
{
  $status = ($_POST['login']) ? 'Bitte korrekte Daten angeben!' : 'Bitte nochmal checken!';
}  
?>

<?PHP
session_start (); 

if (!isset($_SESSION['user_id']) || empty($_SESSION['user_id'])
{
  header("location: http://server-url/login.php");
  exit;
}
//Dieser Bereich ist schon geschützt
echo "Hallo" . $_SESSION['user_nick'];
?>
 
Super, danke danke danke für deine Hilfe!

Jetzt kommt folgende Meldung:

Warning: Cannot modify header information - headers already sent by (output started at x:\xxxx\login.php:53) in x:\xxxx\login.php on line 82

Line 53 fängt der Code an
Line 82: header('Location: index.php');
 
Vor [phpf]session_start[/phpf] und [phpf]header[/phpf] darf weder HTML-Code noch Ausgabe von PHP (in Form von [phpf]echo[/phpf], [phpf]print[/phpf] etc.) stehen. Oder du Speicherst die Ausgabe zwischen. Dazu folgendes vor allen Code: [phpf]ob_start[/phpf] und ans Ende: [phpf]ob_end_flush[/phpf].
 
Ja schonmal von gehört ;)

Also müsste ich ganz oben direkt nach session_start ob_start schreiben?

PHP:
<?PHP 
session_start (); 
ob_start() ;

dann folgt html code ...und wo setz ich das ende hin? nach dem html code?
Wie war das noch mit dem Wald vor lauter Bäumen nicht mehr sehen?:D

GLaub ich geh gleich mal ins Bett ;)
 
Zuletzt bearbeitet:
Also entweder du machst sämtlichen PHP-Code (bzw. Funktionen, vor denen keine Ausgabe erfolgen darf, [phpf]header[/phpf] und [phpf]session_start[/phpf] in diesem Fall...) vor HTML:
PHP:
<?php
session_start();

if ($_POST['user_nick'] && $_POST['user_passwort'])
{
    // siehe code oben... nur um jetzt kürzer zu machen
}
//usw... 
?>
<html>
<!-- Das ganze HTML-Zeug -->
</html>

Oder mit der Ausgabepufferung:
PHP:
<?php
ob_start();
?>
<html>
<!-- Noch mehr HTML -->
<?php
session_start();
header('Location: hierundda.php');
// Loginkram was-weiß-ich...
?>
</html>
<?php
ob_end_flush();
?>
 
Zuletzt bearbeitet:
Hab jetzt die 2. Variante genommen ..

Login funktioniert mit richtigen Daten werde ich auf die index zurück geleitet!
(header('Location: http://server/index.htm');) , aber
folgendes macht er nicht:

PHP:
if ($row['user_nick'] == $_POST['user_nick'] && $row['user_passwort'] == $_POST['user_passwort'])
  {
    $status = "Login korrekt! Hallo " . $row['user_nick'];
    $user_id = $_REQUEST['user_id'];
    $_SESSION['user_id'] = $user_id;
    $user_nick = $_REQUEST['user_nick'];
    $_SESSION['user_nick'] = $user_nick;
    header('Location: http://server/index.htm');
  }
  else 
  {
    $status = "Falsche Login-Daten oder Passwort falsch";
  }
}  
else 
{
  $status = ($_POST['login']) ? 'Bitte korrekte Daten angeben!' : 'Bitte nochmal checken!';
}

und das auch nicht ..
PHP:
<?PHP
session_start (); 

if (!isset($_SESSION['user_id']) || empty($_SESSION['user_id']))
{
  header("location: http://server/login.php");
  exit;
}
else 
{
//Dieser Bereich ist schon geschützt
echo "Hallo" . $_SESSION['user_nick'];
}
?>

Also es wird kein "Begrüßungstext" ausgegeben und bei Falscheingabe erscheint auch keine Fehlermeldung.
 
Zuletzt bearbeitet:
So, also ich hab das jetzt einfach mal selber geschrieben und getestet. Bei mir klappt alles wunderbar mit folgendem Code (natürlich nicht für den Produktiveinsatz gedacht, da das Passwort unverschlüsselt gespeichert wird etc.):
login.php
PHP:
<?php
error_reporting(E_ALL);
session_start();

if(!defined('SID'))
{
  define('SID', session_name() . '=' . session_id());
}

if(isset($_POST['login']))
{
  mysql_connect('localhost', 'root', 'mowk4ever') or die(mysql_error());
  mysql_select_db('test') or die(mysql_error());  
  
  $user_nick = mysql_real_escape_string($_POST['user_nick']);
  $user_passwort = mysql_real_escape_string($_POST['user_passwort']);

  $sql = "SELECT
	         `user_id`, COUNT(`user_nick`) AS `status`
          FROM
	         `users`
          WHERE
	         `user_nick` = '{$user_nick}' 
	         AND 
		        `user_passwort` = '{$user_passwort}'
          GROUP BY
	         `user_id`";
		        
	$select = mysql_query($sql) or die(mysql_error());
	$row = mysql_fetch_array($select);
	if($row['status'] > 0)
	{
    $_SESSION['user_nick'] = $user_nick;
    $_SESSION['user_id'] = $row['user_id'];
    
    header('Location: index.php?' . SID); // Wichtig, dass du auf Groß- und Kleinschreibung bei Headerfehldern achtest, also bei Location
  }
  else
  {
    echo 'Login fehlgeschlagen, bitte erneut probieren.';
  }
}
?>
<html>
  <head>
    <title>
      Kontaktformular mit PHP
    </title>
  </head>
  <body>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
      <input type="text" name="user_nick" value="Benutzername">
      <input type="password" name="user_passwort">
      <input type="submit" name="login" value="Login">
    </form>
  </body>
</html>

index.php
PHP:
<?php
error_reporting(E_ALL);
session_start();

if(!isset($_SESSION['user_id']) || empty($_SESSION['user_id']))
{
  header('Location: login.php');
  exit;
}
?>
<html>
  <head>
    <title>
      Kontaktformular mit PHP - geschützter Bereich
    </title>
  </head>
  <body>
    <p> 
      Nur für zugelassene Mitglieder einsehbar!
      Du bist ein zugelassenes Mitglied!
    </p>
  </body>
</html>
 
Also, SID ist eine Konstante die normalerweise schon vordefiniert ist von PHP (ich weiß aber nicht ab welcher Version, daher hab ich das mal zur Sicherheit eingebaut) und einfach den String session_name=session_id enthält. Ist nur um später Tipparbeit zu sparen. [phpf]mysql_real_escape_string[/phpf] sichert die vom User übergebenen Logindaten gegen SQL-Injections ab.
 
Zurück