OOP database class
Ozzie PHP op 25/08/2011 10:12:30:
Dat was wel hoe ik het destijds gedaan had, maar dan deed ik het ongeveer op deze manier:
destijds? Hoe doe je het nu dan?
Bumpje :) ben wel benieuwd hoe je het nu doet.
Ah nee, sorry... ik bedoelde dat ik het destijds zo gedaan had. Nu zou ik weer voor diezelfde oplossing kiezen :)
Ah ok bedankt Ozzie. Wat vinden de andere PHP'ers van deze oplossing?
Quote:
In plaats van dat je dus allerlei verschillende soorten exceptions heb, gebruik je er slechts 1 (MyException) en daar stuur je alles naartoe. Aan de hand van de parameter wordt in de MyException class bepaald om wat voor soort Exception het gaat.
Ik zie hier niet echt een voordeel in boven verschillende exception classes die ieder hun eigen context-data bij zich kunnen hebben. Ook denk ik niet dat dit gemakkelijker is, omdat specifieke exceptions vangen niet langer triviaal is.
Voorbeeldje:
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
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
<?php
class UserStoreException extends Exception
{
const ERROR_USERNAME_TAKEN = 1;
const ERROR_EMAIL_INVALID = 2;
}
class MailException extends Exception
{}
function insert_user($username, $email)
{
if (!is_valid_email($email))
throw new UserStoreException("The emailaddress is not valid",
UserStoreException::ERROR_EMAIL_INVALID);
$user_id = null;
try {
global $pdo;
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");
$stmt->execute(compact('username', 'email'));
$user_id = $pdo->lastInsertId();
}
catch (PDOException $e)
{
if ($e->getCode() == 23000) // unique constraint failed
throw new UserStoreException("Username already taken",
UserStoreException::ERROR_USERNAME_TAKEN, $e);
else
throw $e; // andere PDO exception, geen idee wat ik er mee moet
}
$password = generate_password();
set_user_password($user_id, $password);
send_password_email($email, $password);
return $user_id;
}
try {
insert_user($_POST['username'], $_POST['email']);
}
catch(UserStoreException $e)
{
show_register_form();
}
catch (MailException $e)
{
echo "Your account was created, but the password could not be mailed. Please request a new one";
}
catch (PDOException $e)
{
echo "My database server and I are having an argument. Please steer clear till the winner has been decided";
}
catch (Exception $e)
{
echo "Shit happens";
}
?>
class UserStoreException extends Exception
{
const ERROR_USERNAME_TAKEN = 1;
const ERROR_EMAIL_INVALID = 2;
}
class MailException extends Exception
{}
function insert_user($username, $email)
{
if (!is_valid_email($email))
throw new UserStoreException("The emailaddress is not valid",
UserStoreException::ERROR_EMAIL_INVALID);
$user_id = null;
try {
global $pdo;
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");
$stmt->execute(compact('username', 'email'));
$user_id = $pdo->lastInsertId();
}
catch (PDOException $e)
{
if ($e->getCode() == 23000) // unique constraint failed
throw new UserStoreException("Username already taken",
UserStoreException::ERROR_USERNAME_TAKEN, $e);
else
throw $e; // andere PDO exception, geen idee wat ik er mee moet
}
$password = generate_password();
set_user_password($user_id, $password);
send_password_email($email, $password);
return $user_id;
}
try {
insert_user($_POST['username'], $_POST['email']);
}
catch(UserStoreException $e)
{
show_register_form();
}
catch (MailException $e)
{
echo "Your account was created, but the password could not be mailed. Please request a new one";
}
catch (PDOException $e)
{
echo "My database server and I are having an argument. Please steer clear till the winner has been decided";
}
catch (Exception $e)
{
echo "Shit happens";
}
?>
Gewijzigd op 26/08/2011 20:27:22 door Ozzie PHP
Niet alle errors zijn hetzelfde, en daarom zou ik ze ook niet allemaal hetzelfde behandelen. Moet dat dan toch, dan kan je aan het einde nog een pokemon-statement neerzetten die alles vangt, zoals ik ook heb gedaan.
Naja, ieder doet het op z'n eigen manier denk ik...
Overigens wordt "mijn" manier vaker toegepast las ik zojuist terwijl ik naar die pokemon manier aan het zoeken was. Iemand op een forum zei: "Hmm, I've done this before. In web apps, it's a good idea to do it at the top level and dump out an error page." Dat is precies wat ik doe.
Ozzie PHP op 27/08/2011 14:03:56:
Aha... got to catch 'em all!! Pokemon is van voor mijn tijd, maar het is dus eigenlijk vergelijkbaar met de "default" bij een switch?
Haha, als Pokemon voor je tijd is dan ben je vijf of misschien nog wel niet geboren.
ik bedoel het dus precies andersom... ik ben van voor pokemons tijd, hahaha :-)))