Ich wollte mal ein bisschen mit Klassen arbeiten. Erstes Ziel: Ein Login-System
Hier erstmal meine "user"-Klasse (gekürzt):
Hier der Code, wie er am Anfang von jedem Script ausgeführt wird (gekürzt):
Der Konstruktor der Klasse 'user' bekommt also nur Benutzerdaten, wenn bereits eine Session besteht. Beim Login-Vorgang wird dem Konstruktor nur die Datenbank-Klasse übergeben. Der eigentliche Vorgang wird dann über die Methode login() ausgeführt.
Das ich in dem momentan Zustand unmöglich eine Funktion für beide Aufgaben nutzen kann, ist klar - einmal wird der Login-Name sowie das unverschlüsselte Passwort übergeben, ansonsten die Benutzer-ID und das "verschlüsselte" Passwort.
Wäre es nun elegant, diese gewisse Redundanz so zu beseitigen, indem ich eine mySQL-Query für beide Fälle habe, d.h.
So könnte ich dann den Konstruktor für beides verwenden. Ob der Login erfolgreich war kann ich ja dann mit $user->login ok überprüfen.
Was meint ihr dazu?
Hier erstmal meine "user"-Klasse (gekürzt):
PHP-Code:
class user
{
function user(mysql $db_con,$uid = 0, $md5pw = '')
{
$this->db = $db_con;
if ($uid > 0 && !empty($md5pw))
{
$this->db->sql_query("SELECT * FROM {$this->db->prefix}users
WHERE user_id='$uid' AND passwd='$md5pw' LIMIT 1");
if ($this->db->sql_num_rows() != 0)
{
$this->login_ok = true;
$this->init();
}
}
}
function login($loginname, $passwd)
{
$this->db->sql_query("SELECT * FROM {$this->db->prefix}users
WHERE login_name = '$loginname' AND passwd='".md5($passwd)."' LIMIT 1");
if ($this->db->sql_num_rows() !=0)
{
$this->login_ok = true;
$this->init();
return true;
}
else
{
return false;
}
}
private function init()
{
/* profil, rechte etc. laden */
}
}
?>
PHP-Code:
if (!empty($_SESSION['user_id']) && !empty($_SESSION['md5_pass']))
{
if (isset($_GET['user_logout']))
{ // logout
}
else
{
$user = new user($db, $_SESSION['user_id'], $_SESSION['md5_pass']);
}
}
else
{
$user = new user($db);
if (!empty($_POST['login_user']) && !empty($_POST['login_pass']))
{
if ($user->login($_POST['login_user'], $_POST['login_pass']))
{
$_SESSION['user_id'] = $user->data['user_id'];
$_SESSION['md5_pass'] = $user->data['passwd'];
$m = new sysmsg('Login erfolgreich.');
}
else
{
$m = new sysmsg('Ungültiger Benutzername/falsches Passwort.');
}
$m->redirect(eregi_replace('user_logout([^&]*)','',$_SERVER['HTTP_REFERER']));
$m->out();
}
}
Das ich in dem momentan Zustand unmöglich eine Funktion für beide Aufgaben nutzen kann, ist klar - einmal wird der Login-Name sowie das unverschlüsselte Passwort übergeben, ansonsten die Benutzer-ID und das "verschlüsselte" Passwort.
Wäre es nun elegant, diese gewisse Redundanz so zu beseitigen, indem ich eine mySQL-Query für beide Fälle habe, d.h.
Code:
...WHERE (login_name='$user' AND passwd=md5($pw)) OR (user_id='$user' AND passwd='$pw')
Was meint ihr dazu?
Kommentar