Is dit goede OOP?
Ik ben nog maar een beginner in de wereld van OOP, daarom wil ik jullie vragen wat jullie van onderstaande codes vinden. Ik hoor graag jullie commentaar hoe het beter, sneller en korter kan met 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
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
class Database{
public $dbh;
protected $_hostname = "";
protected $_database = "";
protected $_username = "";
protected $_password = "";
public function connect(){
try {
$this->dbh = new PDO("mysql:host=".$this->_hostname.";dbname=".$this->_database.";",$this->_username, $this->_password);
return $this->dbh;
}
catch(PDOException $e){
echo $e->getMessage();
}
}
public function escape($string) {
return quote($string, $this->dbh);
}
public function query($query) {
$query = $this->dbh->prepare($query);
return $query->execute();
}
public function fetchAssoc($result) {
return $result->fetch(PDO::FETCH_ASSOC);
}
public function fetchObject($result) {
return $result->fetch(PDO::FETCH_OBJ);
}
public function numRows($result) {
return $result->rowCount();
}
}
class Message {
private $_db;
private $_from;
private $_to;
private $_subject;
private $_message;
public function __construct($db,$from,$to,$subject,$message) {
$this->_db = $db;
$this->_from = $from;
$this->_to = $to;
$this->_subject = $subject;
$this->_message = $message;
}
public function send() { # bericht verzenden
$sql = "INSERT INTO pm (msg_from,msg_to,subject,text,time) VALUES (".$this->_from.",".$this->_to.",'".$this->_subject."','".$this->_text."','NOW()')";
$_db->query($sql);
}
}
class CheckMessage {
private $_db;
public $subject;
public $text;
public function __construct($db,$subject,$text) {
$this->_db = $db;
$this->subject = $subject;
$this->text = $text;
}
public function checkText(){ # tekst beveiligen
$this->text = $_db->escape($this->text);
$this->text = nl2br($this->text);
}
public function getText(){ # text ophalen
return $this->text;
}
public function checkSubject(){ # titel beveiligen
$this->subject = $_db->escape($this->subject);
}
public function getSubject(){ # titel ophalen
return $this->subject;
}
}
?>
class Database{
public $dbh;
protected $_hostname = "";
protected $_database = "";
protected $_username = "";
protected $_password = "";
public function connect(){
try {
$this->dbh = new PDO("mysql:host=".$this->_hostname.";dbname=".$this->_database.";",$this->_username, $this->_password);
return $this->dbh;
}
catch(PDOException $e){
echo $e->getMessage();
}
}
public function escape($string) {
return quote($string, $this->dbh);
}
public function query($query) {
$query = $this->dbh->prepare($query);
return $query->execute();
}
public function fetchAssoc($result) {
return $result->fetch(PDO::FETCH_ASSOC);
}
public function fetchObject($result) {
return $result->fetch(PDO::FETCH_OBJ);
}
public function numRows($result) {
return $result->rowCount();
}
}
class Message {
private $_db;
private $_from;
private $_to;
private $_subject;
private $_message;
public function __construct($db,$from,$to,$subject,$message) {
$this->_db = $db;
$this->_from = $from;
$this->_to = $to;
$this->_subject = $subject;
$this->_message = $message;
}
public function send() { # bericht verzenden
$sql = "INSERT INTO pm (msg_from,msg_to,subject,text,time) VALUES (".$this->_from.",".$this->_to.",'".$this->_subject."','".$this->_text."','NOW()')";
$_db->query($sql);
}
}
class CheckMessage {
private $_db;
public $subject;
public $text;
public function __construct($db,$subject,$text) {
$this->_db = $db;
$this->subject = $subject;
$this->text = $text;
}
public function checkText(){ # tekst beveiligen
$this->text = $_db->escape($this->text);
$this->text = nl2br($this->text);
}
public function getText(){ # text ophalen
return $this->text;
}
public function checkSubject(){ # titel beveiligen
$this->subject = $_db->escape($this->subject);
}
public function getSubject(){ # titel ophalen
return $this->subject;
}
}
?>
Een bericht verzenden:
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
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
<?php
# id verzender
$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht";
# De database class wordt geïnstantieerd
$db = New Database();
# Database verbinding maken
$db->connect();
# De controle class wordt geïnstantieerd
$checkmessage = New CheckMessage($db,$subject,$text);
# De text wordt gecontroleerd
$checkmessage->checkText();
# Het onderwerp wordt gecontroleerd
$checkmessage->checkSubject();'
# De verzend class wordt geïnstantieerd
$message = New Message($db,$from,$to,$checkmessage->getText(),$checkmessage->getSubject);
# Bericht word verzonden
echo $message->send();
?>
# id verzender
$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht";
# De database class wordt geïnstantieerd
$db = New Database();
# Database verbinding maken
$db->connect();
# De controle class wordt geïnstantieerd
$checkmessage = New CheckMessage($db,$subject,$text);
# De text wordt gecontroleerd
$checkmessage->checkText();
# Het onderwerp wordt gecontroleerd
$checkmessage->checkSubject();'
# De verzend class wordt geïnstantieerd
$message = New Message($db,$from,$to,$checkmessage->getText(),$checkmessage->getSubject);
# Bericht word verzonden
echo $message->send();
?>
Gewijzigd op 01/01/1970 01:00:00 door Yearupie Achternaamloos
Om te beginnen bouw je met je Database class een extra laag over de PDO class heen, wat op zich ook al een database class is. Bovendien voeg je er geen nieuwe functionaliteit aan toe, dus waarom gebruik je dan niet gewoon PDO als database class?
Ten tweede is de send() method van je Message class niet op zijn plaats. Een bericht zou niet moeten weten hoe hij zichzelf naar de database moet schrijven, maar enkel zijn eigen eigenschappen moeten kennen en kunnen bepalen. Een Message weet niets over een database, en kan dus ook zeker niet met een Database object werken. Deze method zou ik eerder verwachten in een Message_Controller class.
Wat wil je tenslotte bereiken met je CheckMessage class? Ik verwachtte eigenlijk een soort Validator class aan de naam te zien, maar dat bleek alles behalve het geval. Jij hebt er methods in geprogrammeerd die je nooit tegelijkertijd toe hoort te passen op een bericht. Het escapen is een verantwoordelijkheid van de Database class voordat de query uitgevoerd wordt en nl2br() zou ergens in een method moeten staan die voor de presentatie in HTML zorgt. Maar in ieder geval niet hier en zeker niet voordat je de gegevens naar de database schrijft.
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
class Database{
public $dbh;
protected $_hostname = "";
protected $_database = "";
protected $_username = "";
protected $_password = "";
public function connect(){
try {
$this->dbh = new PDO("mysql:host=".$this->_hostname.";dbname=".$this->_database.";",$this->_username, $this->_password);
return $this->dbh;
}
catch(PDOException $e){
echo $e->getMessage();
}
}
}
class Message_Controller {
private $_db;
private $_from;
private $_to;
private $_subject;
private $_message;
public function __construct($db,$from,$to,$subject,$message) {
$this->_db = $db;
$this->_from = $from;
$this->_to = $to;
$this->_subject = $subject;
$this->_message = $message;
}
public function saveMessage() { # bericht opslaan
$sql = "INSERT INTO pm (msg_from,msg_to,subject,text,time) VALUES (:msg_from, :msg_to, :subject, :text,'NOW()')";
$query = $_db->prepare($sql);
$query->bindvalue(':msg_from',$this->_from,PDO::PARAM_INT);
$query->bindvalue(':msg_to',$this->_to,PDO::PARAM_INT);
$query->bindvalue(':subject',$this->_subject,PDO::PARAM_STR);
$query->bindvalue(':text',$this->_text,PDO::PARAM_STR);
$query->execute();
}
}
class Message {
private $_db;
public $id;
public $from;
public $to;
public $subject;
public $message;
public function __construct($db,$id) {
$this->_db = $db;
$this->id = $id;
}
public function setMessageInfo() {
# Zoekt bericht met het id
$sql = "SELECT msg_from,msg_to,subject,message FROM pm WHERE id = ?";
$query = $this->db->prepare($sql);
$query->bindvalue(1,$this->id,PDO::PARAM_INT);
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
# Set alle vars
$this->from = $row['msg_from'];
$this->to = $row['msg_to'];
$this->subject = $row['subject'];
$this->message = $row['message'];
}
public function getFrom() {
return $this->from;
}
public function getTo() {
return $this->to;
}
public function getSubject() {
return $this->subject;
}
public function getMessage() {
return $this->message;
}
}
class Check_Message {
private $_db;
private $_to;
public function __construct($db,$to) {
$this->_db = $db;
$this->_from = $from;
$this->_to = $to;
}
public function checkFrom() {
$sql = "SELECT id FROM tbl_users WHERE id = ?";
$from = prepare($sql);
$from->bindvalue(1,$this->_from,PDO::PARAM_INT)
$from->execute();
if(count($from->fetchAll() > 0)) {
# User bestaat
return true;
}
else{
# User bestaat niet
return false;
}
}
}
?>
class Database{
public $dbh;
protected $_hostname = "";
protected $_database = "";
protected $_username = "";
protected $_password = "";
public function connect(){
try {
$this->dbh = new PDO("mysql:host=".$this->_hostname.";dbname=".$this->_database.";",$this->_username, $this->_password);
return $this->dbh;
}
catch(PDOException $e){
echo $e->getMessage();
}
}
}
class Message_Controller {
private $_db;
private $_from;
private $_to;
private $_subject;
private $_message;
public function __construct($db,$from,$to,$subject,$message) {
$this->_db = $db;
$this->_from = $from;
$this->_to = $to;
$this->_subject = $subject;
$this->_message = $message;
}
public function saveMessage() { # bericht opslaan
$sql = "INSERT INTO pm (msg_from,msg_to,subject,text,time) VALUES (:msg_from, :msg_to, :subject, :text,'NOW()')";
$query = $_db->prepare($sql);
$query->bindvalue(':msg_from',$this->_from,PDO::PARAM_INT);
$query->bindvalue(':msg_to',$this->_to,PDO::PARAM_INT);
$query->bindvalue(':subject',$this->_subject,PDO::PARAM_STR);
$query->bindvalue(':text',$this->_text,PDO::PARAM_STR);
$query->execute();
}
}
class Message {
private $_db;
public $id;
public $from;
public $to;
public $subject;
public $message;
public function __construct($db,$id) {
$this->_db = $db;
$this->id = $id;
}
public function setMessageInfo() {
# Zoekt bericht met het id
$sql = "SELECT msg_from,msg_to,subject,message FROM pm WHERE id = ?";
$query = $this->db->prepare($sql);
$query->bindvalue(1,$this->id,PDO::PARAM_INT);
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
# Set alle vars
$this->from = $row['msg_from'];
$this->to = $row['msg_to'];
$this->subject = $row['subject'];
$this->message = $row['message'];
}
public function getFrom() {
return $this->from;
}
public function getTo() {
return $this->to;
}
public function getSubject() {
return $this->subject;
}
public function getMessage() {
return $this->message;
}
}
class Check_Message {
private $_db;
private $_to;
public function __construct($db,$to) {
$this->_db = $db;
$this->_from = $from;
$this->_to = $to;
}
public function checkFrom() {
$sql = "SELECT id FROM tbl_users WHERE id = ?";
$from = prepare($sql);
$from->bindvalue(1,$this->_from,PDO::PARAM_INT)
$from->execute();
if(count($from->fetchAll() > 0)) {
# User bestaat
return true;
}
else{
# User bestaat niet
return false;
}
}
}
?>
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
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
<?php
# id verzender
$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht";
# De database class wordt geïnstantieerd
$db = New Database();
# Database verbinding maken
$db->connect();
# De controle class wordt geïnstantieerd
$checkmessage = New Check_Message($db,$to,$subject,$text);
# Controleren of gebruiker bestaat
if(!$checkmessage->checkFrom()) {
echo "Verzenden mislukt: gebruiker bestaat niet.";
}
# Controleren of titel niet leeg is
elseif(empty($subject)) {
echo "Je hebt geen titel ingevuld!";
}
# Controleren of bericht niet leeg is
elseif(empty($text)) {
echo "Je hebt geen bericht ingevuld!";
}
# Bericht opslaan
else {
# De Message_Controller class wordt geïnstantieerd
$message = New Message_Controller($db,$from,$to,$checkmessage->getText(),$checkmessage->getSubject);
# Bericht word verzonden
echo $message->saveMessage();
}
?>
# id verzender
$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht";
# De database class wordt geïnstantieerd
$db = New Database();
# Database verbinding maken
$db->connect();
# De controle class wordt geïnstantieerd
$checkmessage = New Check_Message($db,$to,$subject,$text);
# Controleren of gebruiker bestaat
if(!$checkmessage->checkFrom()) {
echo "Verzenden mislukt: gebruiker bestaat niet.";
}
# Controleren of titel niet leeg is
elseif(empty($subject)) {
echo "Je hebt geen titel ingevuld!";
}
# Controleren of bericht niet leeg is
elseif(empty($text)) {
echo "Je hebt geen bericht ingevuld!";
}
# Bericht opslaan
else {
# De Message_Controller class wordt geïnstantieerd
$message = New Message_Controller($db,$from,$to,$checkmessage->getText(),$checkmessage->getSubject);
# Bericht word verzonden
echo $message->saveMessage();
}
?>
Je gaat de goede kan op, maar er zitten nog wel een aantal denkfouten in. Vraag je bij alle properties en methods van een class eens af of die wel bij die class thuis horen. Een propertie setMessageInfo() in de Message class kan zeker, maar daar wil je geen dingen meer uit de database moeten halen.
ps. Die Database class snap ik nog steeds niet. Waarom gebruik je niet enkel de PDO class en dus in plaats van
gewoon
gebruiken?
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Ook heb ik alle database verbindingen naar de Message_Controller gezet.
Voor de rest is er nog een Ubb class in gekomen, alleen weet ik niet zeker of het een goede naam is. Ook heb ik nu de mogelijkheid toegevoegd dat je bericht kan lezen.
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<?php
class Message_Controller {
private $_db;
public function __construct($db) {
$this->_db = $db;
}
public function saveMessage($from,$to,$subject,$text) { # bericht opslaan
$sql = "INSERT INTO pm (msg_from,msg_to,subject,message,time) VALUES (:msg_from, :msg_to, :subject, :text,NOW())";
$query = $this->_db->prepare($sql);
$query->bindvalue(':msg_from',$from,PDO::PARAM_INT);
$query->bindvalue(':msg_to',$to,PDO::PARAM_INT);
$query->bindvalue(':subject',$subject,PDO::PARAM_STR);
$query->bindvalue(':text',$text,PDO::PARAM_STR);
$query->execute();
}
public function getMessage($id) { # bericht ophalen
$sql = "SELECT * FROM pm WHERE id = ?";
$query = $this->_db->prepare($sql);
$query->bindvalue(1,$id,PDO::PARAM_INT);
$query->execute();
return $query->fetch(PDO::FETCH_ASSOC);
}
public function setStatus($id) { # bericht markeren als gelezen
$sql = "UPDATE pm SET status = 1 WHERE id = ?";
$query = $this->_db->prepare($sql);
$query->bindvalue(1,$id,PDO::PARAM_INT);
$query->execute();
}
}
class Message {
private $_db;
public $id;
public $from;
public $to;
public $subject;
public $message;
public $date;
public function __construct($db,$from,$to,$subject,$message,$date) {
$this->_db = $db;
$this->from = $from;
$this->to = $to;
$this->subject = $subject;
$this->message = $message;
$this->date = $date;
}
public function getFrom() {
return $this->from;
}
public function getTo() {
return $this->to;
}
public function getTime() {
return $this->date;
}
public function getSubject() {
return $this->subject;
}
public function getMessage() {
return $this->message;
}
}
class Check_Message {
public $db;
private $_to;
public function __construct($db,$to) {
$this->db = $db;
$this->_to = $to;
}
public function checkTo() {
$sql = "SELECT id FROM tbl_users WHERE id = ?";
$from = $this->db->prepare($sql);
$from->bindvalue(1,$this->_to,PDO::PARAM_INT);
$from->execute();
if(count($from->fetchAll() > 0)) {
# User bestaat
return true;
}
else{
# User bestaat niet
return false;
}
}
}
class Ubb {
public $text;
public $smilies = array(
':)' => "smile.gif",
':(' => "sad.gif",
':D' => "biggrin.gif",
':d' => "biggrin.gif",
':p' => "tongue.gif",
':P' => "tongue.gif",
':-)' => "unsure.gif",
'(A)' => "angel.gif",
'(a)' => "angel.gif",
':s' => "blink.gif",
':S' => "blink.gif",
':$' => "blush.gif",
'(h)' => "cool.gif",
'(H)' => "cool.gif",
':\'(' => "cry.gif",
'--' => "dry.gif",
'-_-' => "dry.gif",
'^^' => "happy.gif",
'^_^' => "happy.gif",
':|' => "huh.gif",
';d' => "laugh.gif",
';D' => "laugh.gif",
':@' => "mad.gif",
':o' => "ohmy.gif",
':O' => "ohmy.gif",
':0' => "ohmy.gif",
'8S' => "woot.gif",
'8s' => "woot.gif",
'8)' => "wacko.gif",
';)' => "wink.gif",
);
public function __construct($text) {
$this->text = $text;
}
public function addCodes() { # maakt de ubb codes
$text = $this->text;
# verander tekens in html
$text = htmlspecialchars($text);
# voegt enters toe
$text = nl2br($text);
foreach($this->smilies AS $find => $replace)
{
# voegt de smilies toe
$text = str_replace(htmlentities($find), "<img src='images/smileys/".$replace."' alt='smileys' />", $text);
}
# maakt plaatjes
$text = preg_replace("#\[img\](http(s)?://)([a-zA-Z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]+)\[/img\]#", "<img src='\\1\\3' />", $text);
# Maakt gekleurde letters
$text = preg_replace("#\[color=(\#[0-9A-F]{6}|[a-z\-]+)\](.*?)\[/color\]#si", "<font color='\\1'>\\2</font>", $text);
return $text;
}
}
?>
class Message_Controller {
private $_db;
public function __construct($db) {
$this->_db = $db;
}
public function saveMessage($from,$to,$subject,$text) { # bericht opslaan
$sql = "INSERT INTO pm (msg_from,msg_to,subject,message,time) VALUES (:msg_from, :msg_to, :subject, :text,NOW())";
$query = $this->_db->prepare($sql);
$query->bindvalue(':msg_from',$from,PDO::PARAM_INT);
$query->bindvalue(':msg_to',$to,PDO::PARAM_INT);
$query->bindvalue(':subject',$subject,PDO::PARAM_STR);
$query->bindvalue(':text',$text,PDO::PARAM_STR);
$query->execute();
}
public function getMessage($id) { # bericht ophalen
$sql = "SELECT * FROM pm WHERE id = ?";
$query = $this->_db->prepare($sql);
$query->bindvalue(1,$id,PDO::PARAM_INT);
$query->execute();
return $query->fetch(PDO::FETCH_ASSOC);
}
public function setStatus($id) { # bericht markeren als gelezen
$sql = "UPDATE pm SET status = 1 WHERE id = ?";
$query = $this->_db->prepare($sql);
$query->bindvalue(1,$id,PDO::PARAM_INT);
$query->execute();
}
}
class Message {
private $_db;
public $id;
public $from;
public $to;
public $subject;
public $message;
public $date;
public function __construct($db,$from,$to,$subject,$message,$date) {
$this->_db = $db;
$this->from = $from;
$this->to = $to;
$this->subject = $subject;
$this->message = $message;
$this->date = $date;
}
public function getFrom() {
return $this->from;
}
public function getTo() {
return $this->to;
}
public function getTime() {
return $this->date;
}
public function getSubject() {
return $this->subject;
}
public function getMessage() {
return $this->message;
}
}
class Check_Message {
public $db;
private $_to;
public function __construct($db,$to) {
$this->db = $db;
$this->_to = $to;
}
public function checkTo() {
$sql = "SELECT id FROM tbl_users WHERE id = ?";
$from = $this->db->prepare($sql);
$from->bindvalue(1,$this->_to,PDO::PARAM_INT);
$from->execute();
if(count($from->fetchAll() > 0)) {
# User bestaat
return true;
}
else{
# User bestaat niet
return false;
}
}
}
class Ubb {
public $text;
public $smilies = array(
':)' => "smile.gif",
':(' => "sad.gif",
':D' => "biggrin.gif",
':d' => "biggrin.gif",
':p' => "tongue.gif",
':P' => "tongue.gif",
':-)' => "unsure.gif",
'(A)' => "angel.gif",
'(a)' => "angel.gif",
':s' => "blink.gif",
':S' => "blink.gif",
':$' => "blush.gif",
'(h)' => "cool.gif",
'(H)' => "cool.gif",
':\'(' => "cry.gif",
'--' => "dry.gif",
'-_-' => "dry.gif",
'^^' => "happy.gif",
'^_^' => "happy.gif",
':|' => "huh.gif",
';d' => "laugh.gif",
';D' => "laugh.gif",
':@' => "mad.gif",
':o' => "ohmy.gif",
':O' => "ohmy.gif",
':0' => "ohmy.gif",
'8S' => "woot.gif",
'8s' => "woot.gif",
'8)' => "wacko.gif",
';)' => "wink.gif",
);
public function __construct($text) {
$this->text = $text;
}
public function addCodes() { # maakt de ubb codes
$text = $this->text;
# verander tekens in html
$text = htmlspecialchars($text);
# voegt enters toe
$text = nl2br($text);
foreach($this->smilies AS $find => $replace)
{
# voegt de smilies toe
$text = str_replace(htmlentities($find), "<img src='images/smileys/".$replace."' alt='smileys' />", $text);
}
# maakt plaatjes
$text = preg_replace("#\[img\](http(s)?://)([a-zA-Z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]+)\[/img\]#", "<img src='\\1\\3' />", $text);
# Maakt gekleurde letters
$text = preg_replace("#\[color=(\#[0-9A-F]{6}|[a-z\-]+)\](.*?)\[/color\]#si", "<font color='\\1'>\\2</font>", $text);
return $text;
}
}
?>
Database:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
# Database gegevens
$hostname = "";
$database = "";
$username = "";
$password = "";
# De database wordt geïnstantieerd
$db = New PDO("mysql:host=".$hostname.";dbname=".$database.";",$username, $password);
?>
# Database gegevens
$hostname = "";
$database = "";
$username = "";
$password = "";
# De database wordt geïnstantieerd
$db = New PDO("mysql:host=".$hostname.";dbname=".$database.";",$username, $password);
?>
Bericht verzenden:
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
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
<?php
/* ---------- Bericht verzenden ---------- */
# id verzender
$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht
haha";
# De controle class wordt geïnstantieerd
$checkmessage = New Check_Message($db,$from);
# Controleren of gebruiker bestaat
if(!$checkmessage->checkTo()) {
echo "Verzenden mislukt: gebruiker bestaat niet.";
}
# Controleren of titel niet leeg is
elseif(empty($subject)) {
echo "Je hebt geen titel ingevuld!";
}
# Controleren of bericht niet leeg is
elseif(empty($text)) {
echo "Je hebt geen bericht ingevuld!";
}
# Bericht opslaan
else {
# De Message_Controller class wordt geïnstantieerd
$message = New Message_Controller($db);
# Bericht word verzonden
$message->saveMessage($from,$to,$subject,$text);
echo "Bericht is verzonden!";
}
?>
/* ---------- Bericht verzenden ---------- */
# id verzender
$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht
haha";
# De controle class wordt geïnstantieerd
$checkmessage = New Check_Message($db,$from);
# Controleren of gebruiker bestaat
if(!$checkmessage->checkTo()) {
echo "Verzenden mislukt: gebruiker bestaat niet.";
}
# Controleren of titel niet leeg is
elseif(empty($subject)) {
echo "Je hebt geen titel ingevuld!";
}
# Controleren of bericht niet leeg is
elseif(empty($text)) {
echo "Je hebt geen bericht ingevuld!";
}
# Bericht opslaan
else {
# De Message_Controller class wordt geïnstantieerd
$message = New Message_Controller($db);
# Bericht word verzonden
$message->saveMessage($from,$to,$subject,$text);
echo "Bericht is verzonden!";
}
?>
Bericht lezen:
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
/* ---------- Bericht lezen ---------- */
# bericht id
$id = 20;
# De Message_Controller class wordt geïnstantieerd
$msg_control = New Message_Controller($db);
# Bericht gegevens worden opgehaald
$row = $msg_control->getMessage($id);
# Bericht als gelezen markeren
$msg_control->setStatus($id);
# De Message class wordt geïnstantieerd
$message = New Message($db,$row['msg_from'],$row['msg_to'],$row['subject'],$row['message'],$row['time']);
# De Make_Html class wordt geïnstantieerd
$ubb = New Ubb($row['message']);
# De html word gemaakt
$text = $ubb->addCodes();
# Bericht schrijven
echo "<p>Van: ".$message->getFrom()."</p>";
echo "<p>Aan: ".$message->getTo()."</p>";
echo "<p>Verzend datum: ".$message->getTime()."</p>";
echo "<p>Titel: ".$message->getSubject()."</p>";
echo "<p>bericht: ".$text."</p>";
?>
/* ---------- Bericht lezen ---------- */
# bericht id
$id = 20;
# De Message_Controller class wordt geïnstantieerd
$msg_control = New Message_Controller($db);
# Bericht gegevens worden opgehaald
$row = $msg_control->getMessage($id);
# Bericht als gelezen markeren
$msg_control->setStatus($id);
# De Message class wordt geïnstantieerd
$message = New Message($db,$row['msg_from'],$row['msg_to'],$row['subject'],$row['message'],$row['time']);
# De Make_Html class wordt geïnstantieerd
$ubb = New Ubb($row['message']);
# De html word gemaakt
$text = $ubb->addCodes();
# Bericht schrijven
echo "<p>Van: ".$message->getFrom()."</p>";
echo "<p>Aan: ".$message->getTo()."</p>";
echo "<p>Verzend datum: ".$message->getTime()."</p>";
echo "<p>Titel: ".$message->getSubject()."</p>";
echo "<p>bericht: ".$text."</p>";
?>
Gewijzigd op 01/01/1970 01:00:00 door Yearupie Achternaamloos
Ik mis hier het User object. Ik neem aan dat deze twee waarden id's van een user voorstellen, dan kun je dat natuurlijk in een User object verwerken. Bovendien ben je dan ook af van je Check_Message class, aangezien de method checkTo() gewoon een method exists() van de User class kan zijn.
Of zou ik dit met een User_controller class ofzoiets moeten maken?
De User_Controller zou de voorkeur hebben, waarbij de exists() method dan zelfs static gedeclareerd zou kunnen worden.
Quote:
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/www/xxx.php on line xxx
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
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
<?php
class User_Controller {
public $db;
public function __construct($db) {
$this->db = $db;
}
public static function exists($id) {
$sql = "SELECT id FROM tbl_users WHERE id = ?";
$from = $this->db->prepare($sql);
$from->bindvalue(1,$id,PDO::PARAM_INT);
$from->execute();
if(count($from->fetchAll() > 0)) {
# User bestaat
return true;
}
else{
# User bestaat niet
return false;
}
}
}
?>
class User_Controller {
public $db;
public function __construct($db) {
$this->db = $db;
}
public static function exists($id) {
$sql = "SELECT id FROM tbl_users WHERE id = ?";
$from = $this->db->prepare($sql);
$from->bindvalue(1,$id,PDO::PARAM_INT);
$from->execute();
if(count($from->fetchAll() > 0)) {
# User bestaat
return true;
}
else{
# User bestaat niet
return false;
}
}
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Yearupie Achternaamloos
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 User {
private $_id;
public function __construct($id) {
$this->_id = $id;
}
}
class User_Controller {
private $_user;
public function __construct($user = null) {
if($user instanceof User) {
$this->_user = $user;
}
else {
$this->_user = $this->new();
}
}
public function new() {
// Maak een nieuw record aan voor een user in de database
// Gebruik eventueel optionele parameters van new()
// Tenslotte maak retourneer je een nieuw User object:
return new User($id);
}
public static function exists(User $user) {
// Controleer of $user bestaat en return true of false
}
}
// Om te controleren of User met id 10 bestaat:
if(User_Controller::exists(new User(10))) {
// User bestaat...
}
?>
class User {
private $_id;
public function __construct($id) {
$this->_id = $id;
}
}
class User_Controller {
private $_user;
public function __construct($user = null) {
if($user instanceof User) {
$this->_user = $user;
}
else {
$this->_user = $this->new();
}
}
public function new() {
// Maak een nieuw record aan voor een user in de database
// Gebruik eventueel optionele parameters van new()
// Tenslotte maak retourneer je een nieuw User object:
return new User($id);
}
public static function exists(User $user) {
// Controleer of $user bestaat en return true of false
}
}
// Om te controleren of User met id 10 bestaat:
if(User_Controller::exists(new User(10))) {
// User bestaat...
}
?>
Dit geeft een kleine indruk van hoe je het aan zou kunnen pakken. De new() method heb ik er ook maar bij gedaan, dat is de manier waarop je een nieuwe user aan zou kunnen maken in de database. Uiteraard kun je hier zelf meer vereiste parameters aan toevoegen.
Ik heb een database verbinding nodig om te kijken of de gebruiker bestaat en dat kan ik dan niet tussen haakjes achter de class doen?
In het geval van "ja, ik controleer het id omdat ik dat in een row in m'n database wil bijvoegen", denk dan ruimer :D Je werkt hier met objecten, geen id's.. id's zijn slechts sleutels om die objecten terug te vinden. En controleren of een id wel bestaat is dan overbodig, je probeert gewoon het user-object op te halen. Mislukt dat, nou, dan bestaat dat id blijkbaar niet.
Combineer je dat geven met positief programmeren (of naïef programmeren, of wat dan ook, iig programmeren alsof het gewoon goed gaat) dan wordt je code heel simpel, en hoef je niet specifiek je id te controleren. Exceptions zorgen er wel voor dat als het mis gaat niet finaal mis gaat.
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
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
<?php
try {
$user_controller = new User_Controller($database);
$message_controller = new Message_Controller($database);
$sender = $user_controller->get($_SESSION['user_id']);
$receiver = $user_controller->get($_POST['user_id']);
// even om aan te geven wat User_Controller::get teruggeeft
assert('$sender instanceof User');
$message = $message_controller->new($sender, $receiver, $_POST['bericht']);
if($message->is_valid($fouten)) // fouten is dan passed-by-reference
{
$message_controller->insert($message);
show_success_message($message);
}
else
{
// een of andere code om je formulier weer tevoorschijn te
// toveren, ingevuld op basis van $message, voorzien van
// dikke rode teksten volgens de data in $fouten
show_message_form($message, $fouten);
}
}
?>
try {
$user_controller = new User_Controller($database);
$message_controller = new Message_Controller($database);
$sender = $user_controller->get($_SESSION['user_id']);
$receiver = $user_controller->get($_POST['user_id']);
// even om aan te geven wat User_Controller::get teruggeeft
assert('$sender instanceof User');
$message = $message_controller->new($sender, $receiver, $_POST['bericht']);
if($message->is_valid($fouten)) // fouten is dan passed-by-reference
{
$message_controller->insert($message);
show_success_message($message);
}
else
{
// een of andere code om je formulier weer tevoorschijn te
// toveren, ingevuld op basis van $message, voorzien van
// dikke rode teksten volgens de data in $fouten
show_message_form($message, $fouten);
}
}
?>
User_Controller::get gooit een exception zodra de row niet gevonden is.
edit: wat je ook zou kunnen doen als je meer email dan pm probeert na te bouwen (maar dit wordt wel ingewikkelder) is zo'n soort opzet, waarbij je een bericht naar meerdere personen kan sturen (de ontvanger is dan niet meer onderdeel van het bericht zelf):
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$message = $message_controller->new($sender, $_POST['message']);
foreach($_POST['receiver_ids'] as $receiver_id) {
$receiver = $message_controller->get($receiver_id);
$message_controller->sendTo($message, $receiver);
}
?>
$message = $message_controller->new($sender, $_POST['message']);
foreach($_POST['receiver_ids'] as $receiver_id) {
$receiver = $message_controller->get($receiver_id);
$message_controller->sendTo($message, $receiver);
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
Het is de bedoeling om te kijken of de user met dat id bestaat, voor de rest hoef ik niks.
Dus mijn vraag: Is het mogelijk om $db in de User_Controller class te krijgen en dan nog steeds via de static manier op te vragen? Zoja, Hoe?
Yearupie schreef op 04.01.2010 16:36:
Dan zou je een instantie van de PDO class als parameter aan die static method mee moeten geven.Dus mijn vraag: Is het mogelijk om $db in de User_Controller class te krijgen en dan nog steeds via de static manier op te vragen? Zoja, Hoe?
Maar ik ben het met Jelmer eens, de manier die hij schetst is een stuk logischer...