Is een database class wel nodig met PDO?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark Hogeveen

Mark Hogeveen

04/06/2013 16:38:20
Quote Anchor link
Hallo, ik zat me af te vragen of een database class wel nodig is als je PDO gebruikt.
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?
 
PHP hulp

PHP hulp

19/04/2024 04:50:27
 
Kris Peeters

Kris Peeters

04/06/2013 16:45:50
Quote Anchor link
Kwestie van smaak.
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.
 
Wouter J

Wouter J

04/06/2013 16:55:50
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

04/06/2013 17:13:43
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$db
= new Database();
?>


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)
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
<?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;
        }
    }
}

?>
 
Mark Hogeveen

Mark Hogeveen

04/06/2013 17:53:22
Quote Anchor link
Dus een database class is eigenlijk altijd wel handig.
 
Ward van der Put
Moderator

Ward van der Put

04/06/2013 18:07:17
Quote Anchor link
Harry hogeveen op 04/06/2013 17:53:22:
Dus een database class is eigenlijk altijd wel handig.
Yep, don't leave home without it.
 
Michael Baks

Michael Baks

04/06/2013 19:58:13
Quote Anchor link
Ward van der Put op 04/06/2013 18:07:17:
Harry hogeveen op 04/06/2013 17:53:22:
Dus een database class is eigenlijk altijd wel handig.
Yep, don't leave home without it.


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.
 
Mark Hogeveen

Mark Hogeveen

05/06/2013 16:45:12
Quote Anchor link
Oke. Maar ik vind het alleen nog moeilijk om classes te "mengen".

Als je bijvoorbeeld connectie wilt maken doe je:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$pdo
= new PDO("'mysql:host=******;dbname=******',******,******");
?>

Maar als je dus met een eigen database class verbinding wil maken doe je (bijvoorbeeld) dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


Alleen hoe doe je de foutafhandeling?
Dan zou je toch dit krijgen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>

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
 
Wouter J

Wouter J

05/06/2013 17:13:37
Quote Anchor link
Allereerst, wie zegt dat de inlog gegevens van de db uit config.php komen? Dat bepaald de Database class niet, dat doet weer een andere klasse.

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)
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
<?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
}
?>
 
Mark Hogeveen

Mark Hogeveen

05/06/2013 17:30:14
Quote Anchor link
Bedankt voor het voorbeeld.
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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

05/06/2013 18:13:03
Quote Anchor link
Een Exception is gewoon een object, maar je zou dit in combinatie met een database bv de dbexception kunnen uitbreiden met de sql string waarop de fout wordt veroorzaakt.
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
 
Mark Hogeveen

Mark Hogeveen

08/06/2013 20:01:16
Quote Anchor link
En ik kan dus ook het beste in mijn Database class PDO extenden he?
 
Wouter J

Wouter J

08/06/2013 23:25:23
Quote Anchor link
Nee, dan heb je het nog niet door. Je Database klasse is een wrapper om een methode van database heen. Het is onafhankelijk van PDO. Wat je het best kan doen is het adapter pattern gebruiken. Voorbeeldje daarvan: http://www.phphulp.nl/php/forum/topic/oop-fouten-records/85511/#612390
 
Koen Vlaswinkel

Koen Vlaswinkel

09/06/2013 08:09:56
Quote Anchor link
In plaats van je eigen Database class zou je ook 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().
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.