Is een database class wel nodig met PDO?
Maar als je mysqli gebruikt lijkt me juist weer wel een database class nodig.
Ik dacht: PDO is eigenlijk al een database class op zich.
en mysqli is niet echt helemaal OOP, maar meer nog met losse functies.
Wat zouden jullie doen? mysqli of PDO gebruiken. En wel of geen eigen database class maken?
Maar inderdaad; het is al een class. Een extra class is sowieso niet nodig.
Maar het kan wel handig zijn; je kan je eigen class naar je wensen bouwen.
O ja, ivm. mysqli. mysqli bestaat in OOP-vorm en in losse functies.
Een database klass is naar mijn mening niet bedoelt omdat je anders met losse functies moet werken. Het is gemaakt omdat je dan verschillen kunt minimaliseren. Je kan dan snel van pdo naar mysql, mysqli of totaal iets anders switchen.
Wouter J op 04/06/2013 16:55:50:
Een database klass is naar mijn mening niet bedoelt omdat je anders met losse functies moet werken. Het is gemaakt omdat je dan verschillen kunt minimaliseren. Je kan dan snel van pdo naar mysql, mysqli of totaal iets anders switchen.
Inderdaad, je wilt bijvoorbeeld zo abstract mogelijk het volgende kunnen doen en dat kan met alleen PDO niet zomaar:
De aparte klasse biedt je daarna de mogelijkheid om achter de schermen te doen wat je goeddunkt. Of dat nu PDO of MySQLi is, maakt niet zoveel uit. Bijvoorbeeld:
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
/**
* @package Database
*/
final class Database extends mysqli
{
const DATABASE_HOST = 'localhost';
const DATABASE_USERNAME = '**********';
const DATABASE_PASSWD = '************';
const DATABASE_DBNAME = '********';
/**
* @param void
* @return object
*/
public function __construct()
{
parent::__construct(
self::DATABASE_HOST,
self::DATABASE_USERNAME,
self::DATABASE_PASSWD,
self::DATABASE_DBNAME
);
/**
* De karakterset voor databaseverbindingen MOET worden ingesteld op
* UTF-8. Mislukt het instellen van UTF-8, dan wordt de verbinding
* resoluut geweigerd.
*/
if (!$this->set_charset('utf8')) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error', true, 500);
}
exit;
}
}
}
?>
/**
* @package Database
*/
final class Database extends mysqli
{
const DATABASE_HOST = 'localhost';
const DATABASE_USERNAME = '**********';
const DATABASE_PASSWD = '************';
const DATABASE_DBNAME = '********';
/**
* @param void
* @return object
*/
public function __construct()
{
parent::__construct(
self::DATABASE_HOST,
self::DATABASE_USERNAME,
self::DATABASE_PASSWD,
self::DATABASE_DBNAME
);
/**
* De karakterset voor databaseverbindingen MOET worden ingesteld op
* UTF-8. Mislukt het instellen van UTF-8, dan wordt de verbinding
* resoluut geweigerd.
*/
if (!$this->set_charset('utf8')) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error', true, 500);
}
exit;
}
}
}
?>
Dus een database class is eigenlijk altijd wel handig.
Harry hogeveen op 04/06/2013 17:53:22:
Yep, don't leave home without it.Dus een database class is eigenlijk altijd wel handig.
Ward van der Put op 04/06/2013 18:07:17:
Harry hogeveen op 04/06/2013 17:53:22:
Yep, don't leave home without it.Dus een database class is eigenlijk altijd wel handig.
De class staat standaard op me USB. Ik kan met mijn class kiezen voor PDO, mysqli en zelfs nog mysql. Daarnaast kan ik meerdere gebruikers en database verwerken. En met de PDO kan ik ook nog met diverse database systemen communiceren. Afhankelijk van de situatie en opdracht verwijder ik het overbodige uit de class. Dus ja een database class is zeer aan te raden.
Als je bijvoorbeeld connectie wilt maken doe je:
Maar als je dus met een eigen database class verbinding wil maken doe je (bijvoorbeeld) dit:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
// Geen parameters nodig in connect(), de gegevens van de db
// staan bijvoorbeeld al in config.php
$db = new Database;
$db->connect();
?>
// Geen parameters nodig in connect(), de gegevens van de db
// staan bijvoorbeeld al in config.php
$db = new Database;
$db->connect();
?>
Alleen hoe doe je de foutafhandeling?
Dan zou je toch dit krijgen?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
// Geen parameters nodig in connect(), de gegevens staan bijvoorbeeld al in config.php
$db = new Database;
try {
$db->connect();
} catch(PDOException $e) {
echo "Foutmelding: ".$e->getMessage();
}
?>
// Geen parameters nodig in connect(), de gegevens staan bijvoorbeeld al in config.php
$db = new Database;
try {
$db->connect();
} catch(PDOException $e) {
echo "Foutmelding: ".$e->getMessage();
}
?>
Dat zal dus niet werken, ik weet niet hoe ik de PDO exception-class moet krijgen van buiten.
Als er iets fout zou gaan, zou connect() van mijn eigen db-class die moeten returnen.
En dan zou je dus zo de fout moeten ophalen: $db->connect()->getMessage();
Of zo iets.
Gewijzigd op 05/06/2013 16:45:54 door Mark Hogeveen
Vervolgens: catchen op PDOException betekend dat we er al weer vanuit gaan dat we PDO gebruiken, wie zegt dat? Wat je dus moet doen is de fouten opvangen in je database klasse (of dat PDOException, mysql_error oid is maakt niet uit) en dan een andere exception (bijv. DatabaseException) gooien:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class PDOMySQLDatabase
{
public function connect($host, $user, $pass, $db)
{
try {
$pdo = new PDO('mysql:host='.$host.';dbname='.$db, $user, $pass)
} catch (PDOException $e) {
throw new DatabaseException('Could not connect to db', 0, $e);
}
}
}
// in gebruik:
try {
$db = new PDOMySQLDatabase();
$db->connect(...);
} catch (DatabaseException $e) {
// ... doe wat leuks
}
?>
class PDOMySQLDatabase
{
public function connect($host, $user, $pass, $db)
{
try {
$pdo = new PDO('mysql:host='.$host.';dbname='.$db, $user, $pass)
} catch (PDOException $e) {
throw new DatabaseException('Could not connect to db', 0, $e);
}
}
}
// in gebruik:
try {
$db = new PDOMySQLDatabase();
$db->connect(...);
} catch (DatabaseException $e) {
// ... doe wat leuks
}
?>
Ik ging uit van PDO omdat ik dat zelf gebruik.
Maar die DatabaseException die je gooit, dat is dan toch een class?
Op lijn 18 bijvoorbeeld zeg je toch dat $e een instantie is van de class DatabaseException, of niet?
En de klasse die voor de db inloggegevens moet zorgen noem ik dan bijvoorbeeld System?
En dan kun je van die klasse dus de db gegevens opvragen.
Wat ik hieruit begrijp is dus in de database class controleren voor errors, vervolgens een error opvangen met PDOException, die weer zetten in een DatabaseException en dan die uit de class sturen. Daarna weer kijken met een try-catch of die class dus een error heeft gestuurd, en zo ja: DatabaseException gebruiken om er bijvoorbeeld de tekst van de error uit te halen. Lijkt me best de goede manier. Alleen snap ik dus niet echt de DatabaseException. Wat dat is.
Gewijzigd op 05/06/2013 17:31:36 door Mark Hogeveen
Met andere woorden, je kan gewoon een class maken die de standaard class Exception van PHP uitbreidt.
Het grote voordeel van try catch constructies, is dat jezelf veel meer in de hand hebt wat end-users te zien krijgen
En ik kan dus ook het beste in mijn Database class PDO extenden he?
Doctrine DBAL kunnen gebruiken. Hierin zitten ook meerdere drivers en kun je ook zelf nog drivers toevoegen. Naast dat, zijn er ook nog methods als insert() en delete().
In plaats van je eigen Database class zou je ook