OOP User classe
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
/*****
*
* Class - Database
*
* Deze class handelt de communicatie met de MySQL Database af.
* De methods kunnen verder worden uitgebreid.
*
* ------------------------------------------------------------
*
*****/
interface Database
{
public function connect($host, $gebruikersnaam, $wachtwoord, $naam);
public function query($query);
}
interface DatabaseResult
{
public function fetch_assoc();
public function fetch_alles();
public function aantal_regels();
}
class MySQL implements Database
{
private $db_connection;
public function connect($host, $gebruikersnaam, $wachtwoord, $naam)
{
// Verbinding maken met de database
if(!($this->db_connection = mysql_connect($host, $gebruikersnaam, $wachtwoord))) {
throw new DatabaseException('Er is een fout opgetreden tijdens het verbinden met de database: '.mysql_error());
}
// Selecteer database
if(!mysql_select_db($naam)) {
throw new DatabaseException('Er is een fout opgetreden tijdens het selecteren van de database: '.mysql_error());
}
}
public function query($query)
{
if(!$result = mysql_query($query)) {
throw new DatabaseException('Er is een fout opgetreden tijdens het uitvoeren van een databasequery: '.mysql_error());
}
return new MySQLResult($result);
}
}
class MySQLResult implements DatabaseResult
{
private $result;
public function __construct($result)
{
$this->result = $result;
}
public function fetch_assoc()
{
return mysql_fetch_assoc($this->result);
}
public function fetch_alles()
{
return mysql_fetch_array($this->result);
}
public function aantal_regels()
{
return mysql_fetch_row($this->result);
}
}
?>
/*****
*
* Class - Database
*
* Deze class handelt de communicatie met de MySQL Database af.
* De methods kunnen verder worden uitgebreid.
*
* ------------------------------------------------------------
*
*****/
interface Database
{
public function connect($host, $gebruikersnaam, $wachtwoord, $naam);
public function query($query);
}
interface DatabaseResult
{
public function fetch_assoc();
public function fetch_alles();
public function aantal_regels();
}
class MySQL implements Database
{
private $db_connection;
public function connect($host, $gebruikersnaam, $wachtwoord, $naam)
{
// Verbinding maken met de database
if(!($this->db_connection = mysql_connect($host, $gebruikersnaam, $wachtwoord))) {
throw new DatabaseException('Er is een fout opgetreden tijdens het verbinden met de database: '.mysql_error());
}
// Selecteer database
if(!mysql_select_db($naam)) {
throw new DatabaseException('Er is een fout opgetreden tijdens het selecteren van de database: '.mysql_error());
}
}
public function query($query)
{
if(!$result = mysql_query($query)) {
throw new DatabaseException('Er is een fout opgetreden tijdens het uitvoeren van een databasequery: '.mysql_error());
}
return new MySQLResult($result);
}
}
class MySQLResult implements DatabaseResult
{
private $result;
public function __construct($result)
{
$this->result = $result;
}
public function fetch_assoc()
{
return mysql_fetch_assoc($this->result);
}
public function fetch_alles()
{
return mysql_fetch_array($this->result);
}
public function aantal_regels()
{
return mysql_fetch_row($this->result);
}
}
?>
Test.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
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
<?php
#===== Database Settings =====#
define('DB_HOST', 'db.*****.nl'); // Database host
define('DB_USER', '.*****.'); // Database username
define('DB_PASS', '.*****.'); // Database password
define('DB_DB', '.*****.'); // Database name
include('class/database.class.php');
// Creeer object database
$db = new MySQL;
// Maak connectie met en selecteer de database
$db->connect(DB_HOST,DB_USER,DB_PASS,DB_DB);
// Insert query
// $query = "INSERT INTO user (email) VALUES ('[email protected]')";
// $db->query($query);
// Select query
$sql = "SELECT email FROM user WHERE id > 0";
$elementen = $db->query($sql)->fetch_alles();
foreach($elementen as $element){
// rest van je code
echo $element.'<br>';
}
?>
#===== Database Settings =====#
define('DB_HOST', 'db.*****.nl'); // Database host
define('DB_USER', '.*****.'); // Database username
define('DB_PASS', '.*****.'); // Database password
define('DB_DB', '.*****.'); // Database name
include('class/database.class.php');
// Creeer object database
$db = new MySQL;
// Maak connectie met en selecteer de database
$db->connect(DB_HOST,DB_USER,DB_PASS,DB_DB);
// Insert query
// $query = "INSERT INTO user (email) VALUES ('[email protected]')";
// $db->query($query);
// Select query
$sql = "SELECT email FROM user WHERE id > 0";
$elementen = $db->query($sql)->fetch_alles();
foreach($elementen as $element){
// rest van je code
echo $element.'<br>';
}
?>
Gewijzigd op 28/12/2010 22:37:55 door Niels K
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
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
<?php
/****
*
* User class
*
****/
class User{
private $_db;
private $_id;
private $_username;
private $_email;
private $_password;
private $_registerDate;
private $_permission;
public function __construct($id='')
{
$this->_id = $id;
$this->_db = new MySQL;
}
public function getEmail()
{
return $this->_db->query("SELECT email FROM user WHERE id = '".mysql_real_escape_string($this->_id)."'");
}//-> getEmail
}//--> User
?>
/****
*
* User class
*
****/
class User{
private $_db;
private $_id;
private $_username;
private $_email;
private $_password;
private $_registerDate;
private $_permission;
public function __construct($id='')
{
$this->_id = $id;
$this->_db = new MySQL;
}
public function getEmail()
{
return $this->_db->query("SELECT email FROM user WHERE id = '".mysql_real_escape_string($this->_id)."'");
}//-> getEmail
}//--> User
?>
Als ik vervolgens het volgende probeer in test.php:
test.php:
Krijg ik de volgende error:
Catchable fatal error: Object of class MySQLResult could not be converted to string in /public/sites/www.******.nl/test.php on line 35
Ik snap dat deze opdracht een resultset teruggeeft en geen string. Daardoor kan deze niet worden weergegeven. Maar is mijn opzet zo goed of zit ik er weer helemaal naast te pielen? Moet ik bijvoorbeeld in de User class in de __construct() wel opnieuw een database object aanmaken? Volgens mij namelijk niet.
URL verwijderd[/modedit]
Gewijzigd op 12/01/2011 18:20:30 door Bas IJzelendoorn
Tip, in je database connectie gebruik maken van MySQLi, of PDO!
Quote:
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 goed, dat is wel heel strict genomen ;) Laten we het eerst even bij één enkele klasse houden.
Ik heb hem even voor je gepimpd. Ga daarna eens aan de slag hoe je hem zou kunnen verbeteren.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
/**
* Schrijf maar een leuk verhaaltje, maar vergeet de phpdocs niet!!
*/
class User
{
/**
* Uitbreidingen moeten mogelijk zijn, dus maak je velden protected
*/
/**
* Database object
*
* @access Protected
* @var Object
*/
protected $db;
protected $id;
protected $username;
protected $email;
protected $password;
protected $registerDate;
protected $permission;
/**
* Constructor construeert een nieuw User object, bladieblabla
*
* @param Integer $id
* @param Object $database
* @access Public
* @return Void
*/
public function __construct( Database $db, $id = null )
{
$this->id = $id;
$this->db = $db;
}
/**
* Methode voor het verkrijgen van het e-mailadres
*
* @access Public
* @return String
*/
public function getEmail( )
{
$query =
"
SELECT
email
FROM
user
WHERE
id = '" .$this->db->escape( $this->id ). "'
";
return $this->db->query( $query )->fetch_assoc( );
}
}
?>
/**
* Schrijf maar een leuk verhaaltje, maar vergeet de phpdocs niet!!
*/
class User
{
/**
* Uitbreidingen moeten mogelijk zijn, dus maak je velden protected
*/
/**
* Database object
*
* @access Protected
* @var Object
*/
protected $db;
protected $id;
protected $username;
protected $email;
protected $password;
protected $registerDate;
protected $permission;
/**
* Constructor construeert een nieuw User object, bladieblabla
*
* @param Integer $id
* @param Object $database
* @access Public
* @return Void
*/
public function __construct( Database $db, $id = null )
{
$this->id = $id;
$this->db = $db;
}
/**
* Methode voor het verkrijgen van het e-mailadres
*
* @access Public
* @return String
*/
public function getEmail( )
{
$query =
"
SELECT
FROM
user
WHERE
id = '" .$this->db->escape( $this->id ). "'
";
return $this->db->query( $query )->fetch_assoc( );
}
}
?>
Nu is dit helemaal niet goed OO, maar het gaat mij er even om dat je netjes, overzichtelijk programmeert.
Verder zijn de volgende dingen in je user klasse helemaal niet relevante en dus niet van belang.
- username
- password
- registerDate
- permission
Maak eens een nieuw concept van hoe jij nu verder zou gaan? Ik weet het ik laat je heel vrij en gooi je in het diepe maar dat is volgens mij veel beter dan dat ik en andere het allemaal aan jouw voorkauw. Hier leer je veel meer van, hiervan leer je ook fouten herkennen.
Wederom veel succes.
Stel dat ik een pagina heb met:
Code (php)
1
2
3
2
3
<?php
echo '<a href="mailto:'.$user->getEmail().'>'.$user->getName().' ('.$user->getEmail().')</a>';
?>
echo '<a href="mailto:'.$user->getEmail().'>'.$user->getName().' ('.$user->getEmail().')</a>';
?>
Dan heb ik voor 1 regel 3 queries nodig.
Doe iets als:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
// ActiveRecord is een klasse met als statisch veld een DBAL
class User extends ActiveRecord
{
protected $id, $email, $name;
public function __construct($name = null, $email = null, $id = null)
{
if(!is_null($name))
$this->name = $name;
if(!is_null($email))
$this->email = $email;
if(is_null($id)) {
if(is_null($name) || is_null($email))
throw new InvalidArgumentException('Name and email are required for inserting a new user');
$this->id = $this->db->insert('user',
array('name'=>$this->name, 'email'=>$this->email)
);
} else
$this->id = $id;
}
public static function load($id, $fields = array('name', 'email')
{
$data = $this->db->select('user', $id, $fields);
$name = isset($data['name']) ? $data['name'] : null;
$email = isset($data['email']) ? $data['email'] : null;
return new self($name, $email, $id);
}
public function getEmail()
{
if(!isset($this->email))
throw new ActiveRecordParameterNotSetException('email') // oid ;)
return $this->email;
}
public function setEmail($email)
{
$this->email = $email;
}
public function save()
{
$this->db->update('user', $this->id,
array('name'=>$this->name, 'email'=>$this->email)
);
}
}
// Nieuwe user maak je als volgt:
$user = new User('Pim', '[email protected]');
$id = $user->getId();
// User ophalen
$user = User::load($id);
// En bewerken
$user->setEmail('[email protected]');
$user->save();
?>
// ActiveRecord is een klasse met als statisch veld een DBAL
class User extends ActiveRecord
{
protected $id, $email, $name;
public function __construct($name = null, $email = null, $id = null)
{
if(!is_null($name))
$this->name = $name;
if(!is_null($email))
$this->email = $email;
if(is_null($id)) {
if(is_null($name) || is_null($email))
throw new InvalidArgumentException('Name and email are required for inserting a new user');
$this->id = $this->db->insert('user',
array('name'=>$this->name, 'email'=>$this->email)
);
} else
$this->id = $id;
}
public static function load($id, $fields = array('name', 'email')
{
$data = $this->db->select('user', $id, $fields);
$name = isset($data['name']) ? $data['name'] : null;
$email = isset($data['email']) ? $data['email'] : null;
return new self($name, $email, $id);
}
public function getEmail()
{
if(!isset($this->email))
throw new ActiveRecordParameterNotSetException('email') // oid ;)
return $this->email;
}
public function setEmail($email)
{
$this->email = $email;
}
public function save()
{
$this->db->update('user', $this->id,
array('name'=>$this->name, 'email'=>$this->email)
);
}
}
// Nieuwe user maak je als volgt:
$user = new User('Pim', '[email protected]');
$id = $user->getId();
// User ophalen
$user = User::load($id);
// En bewerken
$user->setEmail('[email protected]');
$user->save();
?>
Maar dat kan natuurlijk ook anders ;)
Gewijzigd op 31/12/2010 18:10:49 door Pim -
Quote:
Denk aub beter na over deze klasse niels ;)
Quote:
Nu is dit helemaal niet goed OO, maar het gaat mij er even om dat je netjes, overzichtelijk programmeert.
Dat was even de insteek ;) Qua OO gezien slaat dat natuurlijk geheel de plank mis. Daarom quote ik jelmer vanuit een ander topic. Die heeft daar een goede opzet gegeven.
Gewijzigd op 01/01/2011 14:00:48 door Niels K