Versio

[OOP] Telefoonboek V2

Overzicht Reageren

Tim

Tim

05/02/2009 21:32:00
Quote Anchor link
Heey allemaal,


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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>


class_Validator.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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_Telefoonboek.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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_TelefoonboekRecord.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }
}


?>


Groetjes!
Gewijzigd op 01/01/1970 01:00:00 door Tim
 
PHP hulp

PHP hulp

25/05/2012 13:01:51
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Citroen Anoniem Graag

Citroen Anoniem Graag

05/02/2009 22:16:00
Quote Anchor link
Al een stuk beter, ik zou echter de Validator static maken (vooral zn functies bedoel ik). Want een instantie lijkt niet nodig, return gewoon true/false.

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
 
Tim

Tim

06/02/2009 16:32:00
Quote Anchor link
@ Citroen

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!
 
Citroen Anoniem Graag

Citroen Anoniem Graag

06/02/2009 17:21:00
Quote Anchor link
dat van die addRecord had ik niet gezien.

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?
 



Overzicht Reageren