OOP Begin
Ik ben maar weer eens aan de slag gegaan met PHP OOP.
Vooral omdat ik graag wil overstappen op PDO, maar niet bij iedere query een foutafhandeling wil bouwen. Bij m'n MySQL functie werd ik namelijk bij iedere fout op de hoogte gesteld via e-mail.
Hier mijn class:
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
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
<?php
// Test
class test {
// Variables
private $mysql;
// Minimum Settings
public function __construct($database_server, $database_user, $database_password, $database_name) {
$this->database_server = $database_server;
$this->database_user = $database_user;
$this->database_password = $database_password;
$this->database_name = $database_name;
$this->database_connection();
}
// MySQL Connection
private function database_connection() {
try {
$this->mysql = new PDO('mysql:host=' . $this->database_server . ';dbname=' . $this->database_name, $this->database_user, $this->database_password);
$this->mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $error) {
echo $this->database_error($error);
}
}
// Test
public function test() {
try {
$result = $this->mysql->query("SELECT * FROM cms_pages");
foreach($result as $row) {
return $row['code'];
}
} catch(PDOException $error) {
echo $this->database_error($error);
}
}
// Error Reporting
private function database_error($error) {
if (mail('[email protected]', 'Database Error', 'Regelnummmer: ' . $error->getLine() . "\r\n" . 'Bestand: ' . $error->getFile() . "\r\n" . 'Foutmelding: ' . $error->getMessage())) {
return $error->getMessage() . ' <b>We already contacted the administrator.</b>';
} else {
return $error->getMessage() . ' <b>We also failed to contact the administrator.</b>';
}
}
}
$test = new test('localhost', 'root', '', 'test');
echo $test->test();
?>
// Test
class test {
// Variables
private $mysql;
// Minimum Settings
public function __construct($database_server, $database_user, $database_password, $database_name) {
$this->database_server = $database_server;
$this->database_user = $database_user;
$this->database_password = $database_password;
$this->database_name = $database_name;
$this->database_connection();
}
// MySQL Connection
private function database_connection() {
try {
$this->mysql = new PDO('mysql:host=' . $this->database_server . ';dbname=' . $this->database_name, $this->database_user, $this->database_password);
$this->mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $error) {
echo $this->database_error($error);
}
}
// Test
public function test() {
try {
$result = $this->mysql->query("SELECT * FROM cms_pages");
foreach($result as $row) {
return $row['code'];
}
} catch(PDOException $error) {
echo $this->database_error($error);
}
}
// Error Reporting
private function database_error($error) {
if (mail('[email protected]', 'Database Error', 'Regelnummmer: ' . $error->getLine() . "\r\n" . 'Bestand: ' . $error->getFile() . "\r\n" . 'Foutmelding: ' . $error->getMessage())) {
return $error->getMessage() . ' <b>We already contacted the administrator.</b>';
} else {
return $error->getMessage() . ' <b>We also failed to contact the administrator.</b>';
}
}
}
$test = new test('localhost', 'root', '', 'test');
echo $test->test();
?>
Doe ik het goed, of ga ik heel de verkeerde kant op?
Alvast bedankt voor het antwoorden!
Gewijzigd op 29/07/2011 10:57:42 door Sander de Vos
Quote:
Vooral omdat ik graag wil overstappen op PDO, maar niet bij iedere query een foutafhandeling wil bouwen.
Waarom ben je nu bezig met het schrijven van een nieuwe database klasse? PDO voldoet prima aangezien er bij een fout gewoon een PDOException gegooid wordt die je kunt afvangen?
Kortom, wat is de meerwaarde van je eigen database klasse?
ps. En uiteraard hoef je dan niet na elke query foutafhandeling in te bouwen, dat doe je gewoon eenmalig in het catch blok waar je de exception afvangt...
Gewijzigd op 29/07/2011 12:34:21 door Joren de Wit
Daarom leek het me handig om de database connectie ook gewoon in de klasse te zetten.
Ik probeer dus bij iedere database error een e-mail te ontvangen met informatie over de foutmelding. Maar ik wil niet bij iedere query in het catch blok een e-mail opstellen. Daarom vangt de functie database_error de foutmelding op.
Maar is dit een juiste methode, of is daar een betere oplossing voor?
Sander de Vos op 29/07/2011 12:42:21:
Ik ben niet bezig met het schrijven van een database klasse, maar van een cms klasse.
Dit klinkt alsof je niet helemaal op de goede weg bent. Een CMS is een systeem dat, als je het goed OO programmeert, altijd uit meerdere klasses bestaat. Als je met slechts 1 klasse bezig bent, lijkt dat meer op een verzameling van functies dan daadwerkelijk een goede implementatie van de OO denkwijze.
En ja, je kunt prima een klasse schrijven die de foutafhandeling verzorgt zoals jij die wenst. Maar die zul je dan altijd aanroepen in het catch blok waar je de PDOException afvangt, als je PDO gebruikt tenminste. Dus iets als:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
try {
$db = new PDO(...);
// ...
$db->query($sql);
}
catch(PDOException $e) {
$error = new DatabaseError($e);
$error->sendEmail();
}
?>
try {
$db = new PDO(...);
// ...
$db->query($sql);
}
catch(PDOException $e) {
$error = new DatabaseError($e);
$error->sendEmail();
}
?>
De klasse die je nu alleen nog hoeft te schrijven is DatabaseError waarin je de foutafhandeling verder programmeert.
Dus gewoon de class/functie aanroepen in het catch blok die de fout afhandelt.
Bedankt voor je hulp!
(de inhoudsopgave staat aan de rechterkant)
http://www.phphulp.nl/php/tutorial/overig/oop-beginnershandleiding-php5/701/
Ozzie PHP op 29/07/2011 13:32:51:
Lees anders eerst even deze OOP handleiding van ene... ehhh... Joren.... ;-)
Offtopic:
Lol. Ik moet er nog steeds hoofdstukken aan toevoegen :-)
Wel handig hoor zo'n handleiding. Ik ga zeer binnenkort beginnen met het technische deel van m'n CMS. Dan ga ik eerst de handleiding weer even doorlezen :)
Een abstractielaagje over pdo kan toch ooit kwaad? Doctrine dbal is bijvoorbeeld best mooi en handig.
Pim - op 01/08/2011 02:45:52:
Een abstractielaagje over pdo kan toch ooit kwaad? Doctrine dbal is bijvoorbeeld best mooi en handig.
Ik neem aan dat je bedoelt "kan toch nooit kwaad".
Dat klopt ja ;)