[OOP] Telefoonboek V2
Een geupdate versie van mijn uitprobeerseltje. Zoals de naam al doet vermoeden moet het een simpel telefoonboek voorstellen (enkel weergeven en toevoegen). Heb ik op deze manier het OOP-principe goed gebruikt? Commentaar en (opbouwende) kritiek zijn van harte welkom!
Naar aanleiding van de post hieronder heb ik het script aangepast:
index.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
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
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
<?php
require('class_Database.php');
require('class_Telefoonboek.php');
require('class_TelefoonboekRecord.php');
require('class_Validator.php');
$validator = new Validator;
$database = new Database('localhost', 'telefoonboek', 'root', 'usbw');
$telefoonboek = new Telefoonboek($database);
?>
<HTML>
<HEAD>
<TITLE>Telefoonboek</TITLE>
</HEAD>
<BODY>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$validator->checkMix($_POST['name'], 'Uw naam moet uit enkel letters en cijfers bestaan.<br>');
$validator->checkMinLength($_POST['name'], 'Uw naam moet uit minmaal 3 tekens bestaan.<br>', 3);
$validator->checkMaxLength($_POST['name'], 'Uw naam mag uit maximaal 100 tekens bestaan.<br>', 100);
$validator->checkNumber($_POST['number'], 'Uw telefoonboek moet uit enkel cijfers bestaan.<br>');
$validator->checkMinLength($_POST['number'], 'Uw telefoonnummer moet uit minmaal 3 tekens bestaan.<br>', 3);
$validator->checkMaxLength($_POST['number'], 'Uw telefoonnummer mag uit maximaal 100 tekens bestaan.<br>', 25);
$error = $validator->getErrorMessage();
if(empty($error)){
$record = new TelefoonboekRecord;
$record->setName($_POST['name']);
$record->setNumber($_POST['number']);
try {
$telefoonboek->addRecord($record);
} catch(Exception $e) {
echo 'Het nieuwe nummer kon niet worden toegevoegd.';
}
unset($_POST['name']);
unset($_POST['number']);
}else{
echo $error . '<br><br><br>';
}
}
$records = $telefoonboek->getAllRecords();
if(!$records){
echo 'Er zijn geen nummers gevonden.';
}else{
?>
<TABLE>
<TR>
<TD STYLE='width: 200px; font-weight: bold;'>Name</TD>
<TD STYLE='width: 200px; font-weight: bold;'>Number</TD>
</TR>
<?php
for($i = 0; $i < count($records); $i++){
echo '<TR>';
echo '<TD>' . $records[$i]->getName() . '</TD>';
echo '<TD>' . $records[$i]->getNumber() . '</TD>';
echo '</TR>';
}
?>
</TABLE>
<?php
}
?>
<br><br><br><br>
<FORM ACTION='' METHOD='POST'>
<TABLE>
<TR>
<TD>Naam:</TD>
<TD>
<?php
echo '<INPUT TYPE="text" NAME="name" VALUE="' . (isset($_POST['name']) ? $_POST['name'] : '') . '"></TD>';
?>
</TD>
</TR>
<TR>
<TD>Telefoonnummer:</TD>
<TD>
<?php
echo '<INPUT TYPE="text" NAME="number" VALUE="' . (isset($_POST['number']) ? $_POST['number'] : '') . '"></TD>';
?>
</TR>
<TR>
<TD COLSPAN='2'><br><INPUT TYPE='submit' NAME='submit' VALUE='Voeg Toe'></TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
require('class_Database.php');
require('class_Telefoonboek.php');
require('class_TelefoonboekRecord.php');
require('class_Validator.php');
$validator = new Validator;
$database = new Database('localhost', 'telefoonboek', 'root', 'usbw');
$telefoonboek = new Telefoonboek($database);
?>
<HTML>
<HEAD>
<TITLE>Telefoonboek</TITLE>
</HEAD>
<BODY>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$validator->checkMix($_POST['name'], 'Uw naam moet uit enkel letters en cijfers bestaan.<br>');
$validator->checkMinLength($_POST['name'], 'Uw naam moet uit minmaal 3 tekens bestaan.<br>', 3);
$validator->checkMaxLength($_POST['name'], 'Uw naam mag uit maximaal 100 tekens bestaan.<br>', 100);
$validator->checkNumber($_POST['number'], 'Uw telefoonboek moet uit enkel cijfers bestaan.<br>');
$validator->checkMinLength($_POST['number'], 'Uw telefoonnummer moet uit minmaal 3 tekens bestaan.<br>', 3);
$validator->checkMaxLength($_POST['number'], 'Uw telefoonnummer mag uit maximaal 100 tekens bestaan.<br>', 25);
$error = $validator->getErrorMessage();
if(empty($error)){
$record = new TelefoonboekRecord;
$record->setName($_POST['name']);
$record->setNumber($_POST['number']);
try {
$telefoonboek->addRecord($record);
} catch(Exception $e) {
echo 'Het nieuwe nummer kon niet worden toegevoegd.';
}
unset($_POST['name']);
unset($_POST['number']);
}else{
echo $error . '<br><br><br>';
}
}
$records = $telefoonboek->getAllRecords();
if(!$records){
echo 'Er zijn geen nummers gevonden.';
}else{
?>
<TABLE>
<TR>
<TD STYLE='width: 200px; font-weight: bold;'>Name</TD>
<TD STYLE='width: 200px; font-weight: bold;'>Number</TD>
</TR>
<?php
for($i = 0; $i < count($records); $i++){
echo '<TR>';
echo '<TD>' . $records[$i]->getName() . '</TD>';
echo '<TD>' . $records[$i]->getNumber() . '</TD>';
echo '</TR>';
}
?>
</TABLE>
<?php
}
?>
<br><br><br><br>
<FORM ACTION='' METHOD='POST'>
<TABLE>
<TR>
<TD>Naam:</TD>
<TD>
<?php
echo '<INPUT TYPE="text" NAME="name" VALUE="' . (isset($_POST['name']) ? $_POST['name'] : '') . '"></TD>';
?>
</TD>
</TR>
<TR>
<TD>Telefoonnummer:</TD>
<TD>
<?php
echo '<INPUT TYPE="text" NAME="number" VALUE="' . (isset($_POST['number']) ? $_POST['number'] : '') . '"></TD>';
?>
</TR>
<TR>
<TD COLSPAN='2'><br><INPUT TYPE='submit' NAME='submit' VALUE='Voeg Toe'></TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
class_Validator.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
<?php
class Validator {
protected $errorMessage;
public function __construct() {
$this->errorMessage = '';
}
public function checkAlpha($input, $error) {
if(!preg_match( '/^[a-zA-Z]+$/', $input)){
$this->errorMessage .= $error;
}
}
public function checkMix($input, $error) {
if(!preg_match( '/^[a-zA-Z0-9]+$/', $input)){
$this->errorMessage .= $error;
}
}
public function checkNumber($input, $error) {
if(!is_numeric($input)){
$this->errorMessage .= $error;
}
}
public function checkMinLength($input, $error, $min) {
if(strlen($input) < $min){
$this->errorMessage .= $error;
}
}
public function checkMaxLength($input, $error, $max) {
if(strlen($input) > $max){
$this->errorMessage .= $error;
}
}
public function getErrorMessage() {
$error = $this->errorMessage;
$this->errorMessage = '';
return $error;
}
}
?>
class Validator {
protected $errorMessage;
public function __construct() {
$this->errorMessage = '';
}
public function checkAlpha($input, $error) {
if(!preg_match( '/^[a-zA-Z]+$/', $input)){
$this->errorMessage .= $error;
}
}
public function checkMix($input, $error) {
if(!preg_match( '/^[a-zA-Z0-9]+$/', $input)){
$this->errorMessage .= $error;
}
}
public function checkNumber($input, $error) {
if(!is_numeric($input)){
$this->errorMessage .= $error;
}
}
public function checkMinLength($input, $error, $min) {
if(strlen($input) < $min){
$this->errorMessage .= $error;
}
}
public function checkMaxLength($input, $error, $max) {
if(strlen($input) > $max){
$this->errorMessage .= $error;
}
}
public function getErrorMessage() {
$error = $this->errorMessage;
$this->errorMessage = '';
return $error;
}
}
?>
class_Telefoonboek.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
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
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
<?php
class Telefoonboek {
protected $database;
public function __construct($database) {
$this->database = $database;
}
public function addRecord($record) {
$sql = 'INSERT INTO telefoonboek SET name="' . mysql_real_escape_string($record->getName()) . '",
number="' . mysql_real_escape_string($record->getNumber()) . '"';
$result = $this->database->makeRow($sql);
if(!$result){
throw new Exception('');
}
return true;
}
public function getAllRecords() {
$sql = 'SELECT * FROM telefoonboek';
$count = $this->database->countRows($sql);
if($count > 0){
$rows = $this->database->getRows($sql);
for($i = 0; $i < count($rows); $i++){
$record = new TelefoonboekRecord;
$record->setId($rows[$i]['id']);
$record->setName($rows[$i]['name']);
$record->setNumber($rows[$i]['number']);
$records[] = $record;
}
return $records;
}else{
return false;
}
}
public function getRecord($id) {
$sql = 'SELECT * FROM telefoonboek WHERE id="' . mysql_real_escape_string($id) . '"';
$count = $this->database->countRows($sql);
if($count == 1){
$row = $this->database->getRow($sql);
$record = new TelefoonboekRecord;
$record->setId($row['id']);
$record->setName($row['name']);
$record->setNumber($row['number']);
return $record;
}else{
throw new Exception('');
}
}
}
?>
class Telefoonboek {
protected $database;
public function __construct($database) {
$this->database = $database;
}
public function addRecord($record) {
$sql = 'INSERT INTO telefoonboek SET name="' . mysql_real_escape_string($record->getName()) . '",
number="' . mysql_real_escape_string($record->getNumber()) . '"';
$result = $this->database->makeRow($sql);
if(!$result){
throw new Exception('');
}
return true;
}
public function getAllRecords() {
$sql = 'SELECT * FROM telefoonboek';
$count = $this->database->countRows($sql);
if($count > 0){
$rows = $this->database->getRows($sql);
for($i = 0; $i < count($rows); $i++){
$record = new TelefoonboekRecord;
$record->setId($rows[$i]['id']);
$record->setName($rows[$i]['name']);
$record->setNumber($rows[$i]['number']);
$records[] = $record;
}
return $records;
}else{
return false;
}
}
public function getRecord($id) {
$sql = 'SELECT * FROM telefoonboek WHERE id="' . mysql_real_escape_string($id) . '"';
$count = $this->database->countRows($sql);
if($count == 1){
$row = $this->database->getRow($sql);
$record = new TelefoonboekRecord;
$record->setId($row['id']);
$record->setName($row['name']);
$record->setNumber($row['number']);
return $record;
}else{
throw new Exception('');
}
}
}
?>
class_TelefoonboekRecord.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
36
37
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
<?php
class TelefoonboekRecord {
protected $id, $name, $number;
function __contruct() {
$this->id = 0;
$this->name = '';
$this->number = '';
}
public function setId($id) {
$this->id = $id;
}
public function getId() {
return $this->id;
}
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function setNumber($number) {
$this->number = $number;
}
public function getNumber() {
return $this->number;
}
}
?>
class TelefoonboekRecord {
protected $id, $name, $number;
function __contruct() {
$this->id = 0;
$this->name = '';
$this->number = '';
}
public function setId($id) {
$this->id = $id;
}
public function getId() {
return $this->id;
}
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function setNumber($number) {
$this->number = $number;
}
public function getNumber() {
return $this->number;
}
}
?>
Groetjes!
Gewijzigd op 01/01/1970 01:00:00 door Tim
Ik zou de telefoonboekclasse een instantie van db meegeven (via constructor) en niet in de constructor aanmaken. (ondehoud technisch gezien).
Ik zou bij addRecord een object van TelefoonboekRecord meegeven in plaats van de losse waarde.
if(!$result){
return false;
}
uit de addRecord functie.
Daar zou ik gewoon een exception gooien, het is tenslotte overwacht gedrag, en niet een verwachte boolean.
Verder is de opzet al een stuk beter, maar in mijn ogne nog niet perfect.
Gewijzigd op 01/01/1970 01:00:00 door Citroen Anoniem Graag
De validator kan idd static zijn, maar ik heb hem nog wat bijgewerkt en denk dat het dan handiger is om dat niet te doen.
De DB geef ik nu mee aan de class en initieer ik niet in de constructor.
Die addRecord krijgt al een TelefoonboekRecord mee.
En als laatste die return false vervangen door een exception.
Bedankt voor je hulp!
Misschien kan je die regel beter vervangen door onderstaande:
public function addRecord(TelefoonboekRecord $record) {
op die manier dwing je af dat er een object van TelefoonboekRecord móét worden meegegeven en niet een ander object.
Verder vraag ik me nog af waarom je de exception geen foutbeschrijving mee geeft?