OOP - Login (vervolg)
Ik heb een klein vraagje over het onderwerp wat laatst is besproken: "http://www.phphulp.nl/php/forum/topic/oop-login/75926/1/".
Class Database
Class User
Nu wil ik mysqli gebruiken om de user in te loggen. Dit geeft (bij mij) alleen een probleem.
De class User kan niet bij de gegevens uit class Database, en dus geen query uitvoeren omdat ik een belangrijke parameter mis.
Voorbeeld class User (ik kan dus niet bij de variabele $link uit class Database):
Code (php)
1
2
3
2
3
<?php
$result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
?>
$result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
?>
Dit maakt de class Database dus overbodig?
Het volledige script (class_lib.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
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
<?php
class database{
public function connect(){
$link = mysqli_connect('localhost','root','','login');
}
}
class user{
public function connect(){
$link = database::connect(); //werkt niet
$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{
public function connect(){
$link = mysqli_connect('localhost','root','','login');
}
}
class user{
public function connect(){
$link = database::connect(); //werkt niet
$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 30/01/2011 01:16:55 door Wouter OOP
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
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
<?php
class database{
public function connect(){
$link = mysqli_connect('localhost','root','','login');
}
}
$database = new Database;
$user = new User($database);
class user{
private $_database;
public function connect(database $database){
$this->_database = $database; //nu kan je gewoon alle functies gebruiken uit je db object via $this->_database->functie()
$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{
public function connect(){
$link = mysqli_connect('localhost','root','','login');
}
}
$database = new Database;
$user = new User($database);
class user{
private $_database;
public function connect(database $database){
$this->_database = $database; //nu kan je gewoon alle functies gebruiken uit je db object via $this->_database->functie()
$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 30/01/2011 13:35:58 door Mar cel
Dus ook het MySQLi object
Zou je me een voorbeeld kunnen geven hoe ik dat hier zou kunnen gebruiken?
Gewijzigd op 30/01/2011 17:58:19 door Bas IJzelendoorn
The Dutch Guy op 30/01/2011 17:57:16:
Zou je in het vervolg als het over vrijwel dezelfde vraag/script gaat, zoals je al zelf zegt, in hetzelfde topic willen doorgaan?![/modedit]
Ik zal hier voortaan op letten. Helaas antwoordde niemand meer, vandaar.
De bovenstaande code heb ik wat aangepast, maar bij mij werkt het niet. Wat doe ik fout?
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_lib.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 database{
public function connect(){
$link = mysqli_connect('localhost','root','','login');
}
}
class user{
protected $_database;
public function connect($database){
$this->_database = $database;
$link = $this->_database->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{
public function connect(){
$link = mysqli_connect('localhost','root','','login');
}
}
class user{
protected $_database;
public function connect($database){
$this->_database = $database;
$link = $this->_database->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.";
}
}
}
?>
Warning: mysqli_query() expects parameter 1 to be mysqli, null given in...
Gewijzigd op 31/01/2011 22:43:00 door Wouter OOP
- Mysql_error is geen MySQLi.
- Gebruik geen or die in OOP, doe mooie foutafhandeling met exceptions
- Regel 21 en 22 onnodig variabele kopiëren
- Gebruik geen superglobals in OOP, laat de gebruik die invoeren.
- Functie connect geeft niet aan wat er gebeurd. Noem hem bijv. login.
Onzinnig...
Ik neem aan dat je de basale concepten van OOP kent. Een daarvan is 'Encapsulation', het scheiden van verantwoordelijkheden. Dit geldt voor objecten, maar helemaal voor methodes. De functie user::connect() mag dus niet de database laten verbinden EN de gebruiker in laten loggen.
Ook mag het object geen gegevens uit server data halen, deze moet je als argumenten invoeren en mag het geen data echoën, alleen teruggeven.
De user mag dus geen query bevatten en de database verbinding overnemen uit het database object?
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
<?php
class user{
protected $_database;
public function setDatabas($database){
$this->_database = $database;
}
public function login($username, $password){
// Gebruik MySQLi's OOP interface
// Laat het database object bij fouten exceptions geven
// Gebruik prepared statements
$result = $this->_database->query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password);
if ($result->num_rows > 0){
return true; // Hoe dat wordt weergegeven is niet de verantwoordelijkheid van dit object
}
else{
return false;
}
}
}
class user{
protected $_database;
public function setDatabas($database){
$this->_database = $database;
}
public function login($username, $password){
// Gebruik MySQLi's OOP interface
// Laat het database object bij fouten exceptions geven
// Gebruik prepared statements
$result = $this->_database->query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password);
if ($result->num_rows > 0){
return true; // Hoe dat wordt weergegeven is niet de verantwoordelijkheid van dit object
}
else{
return false;
}
}
}
Wouter OOP op 31/01/2011 23:18:50:
Nu begrijp ik er niks meer van :P
De user mag dus geen query bevatten en de database verbinding overnemen uit het database object?
De user mag dus geen query bevatten en de database verbinding overnemen uit het database object?
Inderdaad. Als je verder gaat op deze weg, dan doe je geen OOP maar dan doe je stukke code in klassen en methodes dumpen.
Het maakt de User object niet uit waar de inlog-gegevens e.d. vandaan komen, het zou bijvoorbeeld ook uit een XML bestand kunnen komen. Dat is dus het mooie aan OOP, je hoeft maar één keer code te schrijven die in meerdere situaties werkt.
En ja ik voer het misschien wel ver door... Maar goed, ga maar eens spaghetti-code in Java maken, daar wordt je niet blij van. Dus dan kan je het net zo goed direct in één keer goed doen.
Verder is er volgens mij in je vorige topic het e.e.a. ook al uitgelegd.