OOP - Login
Sinds deze week ben ik bezig met OOP. Naar mijn idee gaat het prima, maar ik wil het graag door deskundigen laten controleren.
Ik heb geprobeerd een klassiek loginsysteem naar OOP te vertalen door overnemen, afkijken en prutsen ;).
Kunnen jullie mij vertellen waarom dit goed of fout is?
index.php
Code (php)
<html>
<head>
<title>login</title>
</head>
<body>
<ul>
<form class="user" method="post" action="index.php">
<li>Naam: <input class="user" type="text" size="10" maxlength="40" name="gebruikersnaam"></li>
<li>Wachtwoord: <input class="user" type="password" size="10" maxlength="10" name="wachtwoord"></li>
<input class="submit_user" type="submit" value="Inloggen">
</form>
</ul>
</body>
</html>
class.login.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
class main {
private $host;
private $username;
private $password;
private $database;
public function __construct($host, $username, $password, $database) {
$this->host = $host;
$this->username= $username;
$this->password= $password;
$this->database= $database;
$this->connect();
}
private function connect() {
mysql_connect($this->host, $this->username, $this->password);
mysql_select_db($this->database);
}
public function loginnow() {
$result = mysql_query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . mysql_real_escape_string($_POST['gebruikersnaam']) . "' AND wachtwoord='" . mysql_real_escape_string($_POST['wachtwoord']) . "'");
if (mysql_num_rows($result) > 0) {
echo "Succesvol ingelogd.";
$_SESSION['gebruikersnaam'] = $gebruikersnaam;
}
else {
echo "Vul gebruikersnaam / wachtwoord in.";
}
}
}
?>
class main {
private $host;
private $username;
private $password;
private $database;
public function __construct($host, $username, $password, $database) {
$this->host = $host;
$this->username= $username;
$this->password= $password;
$this->database= $database;
$this->connect();
}
private function connect() {
mysql_connect($this->host, $this->username, $this->password);
mysql_select_db($this->database);
}
public function loginnow() {
$result = mysql_query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . mysql_real_escape_string($_POST['gebruikersnaam']) . "' AND wachtwoord='" . mysql_real_escape_string($_POST['wachtwoord']) . "'");
if (mysql_num_rows($result) > 0) {
echo "Succesvol ingelogd.";
$_SESSION['gebruikersnaam'] = $gebruikersnaam;
}
else {
echo "Vul gebruikersnaam / wachtwoord in.";
}
}
}
?>
- Require kan je -vind ik- beter in het begin doen, dus voor de if
- Het OOP programmeren kan je misschien wel, maar je moet ook OOP kunnen denken. Dat betekend dat je moet leren denken in objecten. Elk object is een class.
Als je bijv. een tabel wilt maken heb je een table object, een tr object en een td object:
> Table
> Row
> Cell
Deze objecten hebben weer eigenschappen. In een Cel staat de content, in een Rij staan cellen en in een Tabel staan rijen. Deze eigenschappen zijn de properties:
> Table
- rows
> Row
- cells
> Cell
- content
Nu heb je alleen nog een gedrag/verandering toe te voegen aan de objecten. Een Cel kan content toevoegen en hij kan zichzelf tonen, een Rij kan cellen toevoegen en hij kan ook zichzelf tonen en een Tabel kan rijen toevoegen en zichzelf ook tonen. Dit zijn de methoden:
> Table
- rows
append()
write()
> Row
- cells
append()
getRows()
> Cells
- content
append()
getCells()
Nu heb je de basis van een tabel. Dit is Object geörienteerd denken en zeker nodig bij het maken van OOP.
Probeer na dit verhaal zelf eens te bedenken welke classes, properties en methodes je nodig hebt voor een login.
- Database zou je eigenlijk in een aparte database handler moeten stoppen.
- Zelfde geld voor sessie
- Variabelen protected, uitbreidingen moet mogelijk blijven
- POST variabelen niet direct in de klasse aanroepen, google eens op een request handler, of maak er variabelen in je methode van.
Maar goed, het concept is al niet goed, en ik quote maar even een bericht van jelmer:
Jelmer rrrr op 28/12/2010 10:17:59:
Heel heel heel strict genomen zou je inloggen en gebruikers moeten scheiden. Je hebt gebruikers, en je hebt een set classen die inloggen mogelijk maken. Die classen regelen dan het opslaan van de combinatie gebruiker – wachtwoord, (of gebruiker + openid, daarom zijn ze losgetrokken van de User class, zodat je verschillende manieren van inloggen kan maken) en die classen regelen het onthouden van de identiteit van iemand na het inloggen.
Maar in veel gevallen is dat misschien wat teveel, en dan zou ik zeggen dat je User_Store::create een extra argument, $password, meegeeft, en een extra method, User_Store::login($username, $password) die dan net zo werkt als User_Store::get($id), en dat je zelf de sessies e.d. afhandelt in een simpele class.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
User_Store
- create($nickname, $email)
- get($id)
User
- id()
// regelt het onthouden van iemands identiteit (in bijv. $_SESSION)
Authentication
- __construct(User_Store $users)
// roept $method->login($arguments) aan, en onthoudt het user-id dat die teruggeeft
- login(AuthenticationMethod $method, array $arguments)
- isLoggedIn()
// geeft $users->get($currentUserId) terug.
- currentUser()
PasswordIdentification extends AuthenticationMethod
// koppelt een gebruiker aan een wachtwoord
- register(User $user, $password)
// geeft user-id terug indien gelukt
- login(array $arguments)
OpenIDIdentification extends AuthentictionMethod
- register(User $user, $openid)
// geeft user-id terug indien gelukt
- login(array $arguments)
- create($nickname, $email)
- get($id)
User
- id()
// regelt het onthouden van iemands identiteit (in bijv. $_SESSION)
Authentication
- __construct(User_Store $users)
// roept $method->login($arguments) aan, en onthoudt het user-id dat die teruggeeft
- login(AuthenticationMethod $method, array $arguments)
- isLoggedIn()
// geeft $users->get($currentUserId) terug.
- currentUser()
PasswordIdentification extends AuthenticationMethod
// koppelt een gebruiker aan een wachtwoord
- register(User $user, $password)
// geeft user-id terug indien gelukt
- login(array $arguments)
OpenIDIdentification extends AuthentictionMethod
- register(User $user, $openid)
// geeft user-id terug indien gelukt
- login(array $arguments)
Maar in veel gevallen is dat misschien wat teveel, en dan zou ik zeggen dat je User_Store::create een extra argument, $password, meegeeft, en een extra method, User_Store::login($username, $password) die dan net zo werkt als User_Store::get($id), en dat je zelf de sessies e.d. afhandelt in een simpele class.
Gewijzigd op 26/01/2011 17:57:53 door Niels K
Ik behandel de database en gebruiker toch apart?
Dus:
Loginsysteem
- ConnectDB
- ConnectUser
Gewijzigd op 26/01/2011 18:34:15 door Wouter OOP
Als je mijn verhaal had gelezen moet je elk object als een aparte class maken, dus geen aparte methode...
- ConnectDB
- ConnectUser
Ik heb je artikel wel gelezen, maar kwam niet tot die conclusie.
Een CMS zou dus kunnen zijn in aparte klassen:
- ConnectDB
methods...
- ConnectUser
methods...
- DisconnectUser
methods...
- CreateArticle
methods...
- EditArticle
methods...
- DeleteArticle
methods...
- Etc...
Correct me if I'm wrong.
Gewijzigd op 26/01/2011 21:26:48 door Wouter OOP
Je moet leren denken in objecten. Wat heb je bij een inlog systeem? Een user object en een object die ervoor zorgt dat die user ingelogd wordt.
In deze objecten/classes zitten weer eigenschappen/properties. Dit zijn voor de user bijv. naam, wachtwoord, ... Daarnaast heeft deze user class ook nog gedragsveranderingen/methoden. Je kan bijv. de naam wijzigen, rank wijzigen, ect.
Een user class zou er dus bijv. zo uit kunnen zien:
> User
- name
- rank
- pass
changeName()
changeRank()
changePass()
Reactie
-reactieaanmaken
-reactiebewerken
-reactieverwijderen
Als ik alleen wil dat een gebruiker aangemeld wordt (dus niet wachtwoord aanpassen etc), dan zijn deze twee klassen toch genoeg:
ConnectDB
ConnectUser
Classes zijn er om objecten mee te maken. Een object is een "ding". Het lijkt dan ook logisch om classes te maken met een naam die een zelfstandig naamwoord is.
Het is een simplificatie ... op drie lijntjes krijg je het niet helemaal uitgelegd.
Connect is iets wat je als object kan doen. Je hebt in jou geval dus een class Database en een class User. Deze heeft dan de functies/methodes connect.
Mag ik deze klassen in één bestand zetten zoals class_lib:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
class database{
protected $host;
protected $username;
protected $password;
protected $database;
public function connect($host, $username, $password, $database){
$this->host = $host;
$this->username= $username;
$this->password= $password;
$this->database= $database;
mysql_connect($this->host, $this->username, $this->password);
mysql_select_db($this->database);
}
}
class user{
public function connect(){
$username = $_POST['gebruikersnaam'];
$password = $_POST['wachtwoord'];
$result = mysql_query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'");
if (mysql_num_rows($result) > 0){
echo "Succesvol ingelogd.";
$_SESSION['gebruikersnaam'] = $username_session;
}
else{
echo "Vul gebruikersnaam / wachtwoord in.";
}
}
}
?>
class database{
protected $host;
protected $username;
protected $password;
protected $database;
public function connect($host, $username, $password, $database){
$this->host = $host;
$this->username= $username;
$this->password= $password;
$this->database= $database;
mysql_connect($this->host, $this->username, $this->password);
mysql_select_db($this->database);
}
}
class user{
public function connect(){
$username = $_POST['gebruikersnaam'];
$password = $_POST['wachtwoord'];
$result = mysql_query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'");
if (mysql_num_rows($result) > 0){
echo "Succesvol ingelogd.";
$_SESSION['gebruikersnaam'] = $username_session;
}
else{
echo "Vul gebruikersnaam / wachtwoord in.";
}
}
}
?>
Gewijzigd op 27/01/2011 19:30:06 door Wouter OOP
Nog een paar punten:
- Waarom database gegevens in $this zetten? Alleen de connectie volstaat toch?
- Ik mis foutenafhandeling
Kan je toelicht waarom je hebt gekozen voor user::connect ?
- Dit is een aangepast script van iemand anders, weet niet waarom die dat gedaan heeft.
- Foutenafhandeling moet inderdaad nog.
+ Gekozen voor connect omdat we de gebruiker gaan verbinden.
Toevoeging op 27/01/2011 20:03:02:
Als ik $this weghaal dan krijg ik de volgende error uit mijn user::connect
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in ...
Iemand een idee hoe dit komt?
Toevoeging op 28/01/2011 15:44:35:
Een volgend probleem. Ik probeer even mysqli, maar het gaat niet werken omdat ik $link niet kan bereiken (regel 24):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
class database{
protected $host;
protected $username;
protected $password;
protected $database;
public function connect(){
$link = mysqli_connect($this->host, $this->username, $this->password, $this->database);
}
}
class user{
public function connect(){
$username = $_POST['gebruikersnaam'];
$password = $_POST['wachtwoord'];
$result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
if (mysqli_num_rows($result) > 0){
echo "Succesvol ingelogd.";
}
else{
echo "Vul gebruikersnaam / wachtwoord in.";
}
}
}
?>
class database{
protected $host;
protected $username;
protected $password;
protected $database;
public function connect(){
$link = mysqli_connect($this->host, $this->username, $this->password, $this->database);
}
}
class user{
public function connect(){
$username = $_POST['gebruikersnaam'];
$password = $_POST['wachtwoord'];
$result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
if (mysqli_num_rows($result) > 0){
echo "Succesvol ingelogd.";
}
else{
echo "Vul gebruikersnaam / wachtwoord in.";
}
}
}
?>
Gewijzigd op 28/01/2011 15:46:38 door Wouter OOP
Wouter OOP op 27/01/2011 18:39:33:
Als ik $this weghaal dan krijg ik de volgende error uit mijn user::connect
Als ik $this weghaal dan krijg ik de volgende error uit mijn user::connect
is het niet user::connect() ipv user:connect?
Gewijzigd op 01/02/2011 22:44:37 door Hendrik de Jager