Wo muß ich in diesem php das mit Session eintragen??
<?php
include("kontakt.inc");
if(@mysql_connect($host, $user, $pwd))
if(@mysql_select_db($dbname))
Gehört nicht zum Thema, aber das ist extrem unklug, was Du hier machst. Fehlermeldungen sind dazu da, Dich über Fehler zu informieren und Fehler müssen behoben werden. Wenn Du die Fehlermeldungen mit @ unterdrückst, wie gedenkst Du dann Fehler zu beheben?
Du hast die Möglichkeit, Fehlermeldungen nicht in der Seite anzuzeigen, sondern in die Fehlerdatei des Webservers zu schreiben. Die Einstellungen dazu lauten display_errors und error_log (siehe PHP-Anleitung, Kapitel Konfiguration).
{
$erg=@mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = '{$_POST['benutzername']}' AND kw = '".md5($_POST['kw'])."'");
Das ist auch nicht richtig. Wenn Du Daten von außen bekommst, tust Du gut daran, diese gegen Manipulationen abzusichern.
$erg=mysql_query("SELECT benutzername, kw FROM benutzer WHERE benutzername = "".mysql_escape_string($_POST["benutzername"]."" AND kw = "".md5($_POST['kw']).""");
if (! $erg) die("DB-Fehler: ".mysql_error());
$erg=mysql_fetch_array($erg,MYSQL_ASSOC);
if($erg['kw']==md5($_POST['kw']))
Woher weißt Du, daß in $erg["kw"] tatsächlich ein Ergebnis steht? Das Passwort wurde schon in der SQL-Abfrage geprüft, Du kannst hier also genauso gut
if (mysql_num_rows($erg)==1)
angeben und vermeidest damit, auf nicht existierende Daten zuzugreifen.
// hierhin
session_start();
$_SESSION["benutzername"] = $_POST["benutzername"];header("Location: /wirtschaft/auswahl.htm");
else
header("Location: /wirtschaft/logginfehler.htm");
}
Diese Weiterleitung ist teilweise unsinnig. Du mußt eh in jeder folgenden Seite prüfen, ob $_SESSION["benutzername"] gesetzt ist, da man andernfalls /wirtschaft/auswahl.htm auch genauso gut direkt anspringen kann. Von daher gehört dieser Teil in die einzelnen Seiten und nicht in das Loginformular.
Die Angabe bei Location _muß_ eine vollständige URL sein, siehe HTTP-Spezifikation, Abschnitt 14.30: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30. Du bekommst den Hostnamen in $_SERVER["HTTP_HOST"].
Weiterhin würde ich der Einfachheit (für die Nutzer) empfehlen, statt eines Benutzernames die Kundennummer zu verwenden bzw. allgemein nur Daten zu verwenden, die eh schon bekannt sind.
Auf das Passwort kann man natürlich so oder so nicht verzichten.
Schreibe Dir also eine Funktion, die prüft, ob der Benutzer schon eingeloggt ist oder sich gerade eingeloggt hat und rufe sie in jeder folgenden Seite auf. Alles in allem sieht das etwa so aus:
function login()
{
session_start();
if (isset($_POST["kundennummer"])) ) // Login-Formular abgeschickt
{
if (! (($db=mysql_connect($host, $user, $pwd)) &&
(mysql_select_db($dbname))
)
) die("DB-Fehler: ".mysql_error());
if (! $dbr=mysql_query("select blabla")) die("DB-Fehler: ".mysql_error());
if ($kunde=mysql_fetch_assoc($dbr))
{
$_SESSION["kunde"]=$kunde; // Kundendaten in Session speichern
}
else
{
$_SESSION=Array(); // fehlgeschlagener Login, Sessiondaten vorsichtshalber löschen
session_destroy();
};
mysql_free_result($dbr);
};
// an diesem Punkt muß entweder der Login geglückt sein oder
// bereits eine Session existieren, falls nicht: Seite verweigern
if (! isset($_SESSION["kunde"]["kundennummer"]))
{
header("HTTP/1.0 303 See other");
header("Location: http://".$_SERVER["HTTP_HOST"]."/wirtschaft/logginfehler.htm");
echo "<html><body><a href="/wirtschaft/logginfehler.htm">Logindaten fehlerhaft</a></body></html>";
exit(); // keine weitere Bearbeitung dieser Datei
};
};
Die Funktion prüft zuerst, ob der Benutzer über das Loginformular gekommen ist und, falls dem so ist, holt die entsprechenden Kundendaten aus der Datenbank. Auf diese Art und Weise kann auch bei einem bereits eingeloggter Browser die Loginseite benutzt werden - man weiß ja nie. Tritt ein Loginfehler auf, wird die möglicherweise existierende Session gelöscht.
Im zweiten, übergeordneten if-Block wird dann geprüft, ob in der aktuellen Session eine Kundennummer gesetzt ist. Falls nicht, wird der Browser an die Loginfehlerseite weitergeleitet und das Skript beendet. Existiert eine Kundennummer, wird die Funktion vollständig durchlaufen und die Seite weiter ausgegeben.
Im Unterschied zu Deiner Variante habe ich gleich die kompletten Kundendaten in der Session gespeichert (daher $_SESSION["kunde"]["kundennummer"]). Das ist nicht unbedingt nötig, aber vielleicht brauchst Du außer der Kundennummer weitere Kundendaten; die sind dann bereits da und Du sparst eine relativ gesehen aufwendige Datenbankabfrage.
irgendwie muss man jetzt noch die session auf den Folgeseiten initialisieren, leider habe ich auf diese Frage selbst noch keine Antowrt erhalten, was man da schreibt.
Komisch, das möchte ich glatt für ein Gerücht halten (http://forum.de.selfhtml.org/archiv/2002/12/33231/#m180761)..
Gruß,
soenk.e