Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] PDO Class database variable sneller aanroepen.

Pagina: 1
Acties:

Onderwerpen


  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
Beste Tweakers,

Nadat ik al een aantal weken bezig ben met PDO wou ik eens een klasse gaan schrijven die ik dan voor meerdere websites kan gebruiken. Deze class werkt in eigenlijk wel zoals het moet. Alleen wanneer ik een query wilt uitvoeren na het verbinden moet het op de volgende manier:
PHP:
1
2
$db = new PDOConnector();
$db->$db->query("SQL_QUERY");

Maar zou het eigenlijk liever op de volgende manier doen:
PHP:
1
2
$db = new PDOConnector();
$db->query("SQL_QUERY");

dus zonder de variable aan te roepen binnen de klasse. Ik heb gekeken naar de function __call maar daar ging het telkens mee fout wanneer ik meerdere functies in de klasse wou maken.

De huidige klasse ziet er zo uit, maar vraag me af of het wel op de manier mogelijk is zoals ik het graag zou willen en of het wel verstandig om het zo te gaan doen of waarom het misschien niet verstandig is.
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
<?php
    class PDOConnector
    {
        
        public $db;

        public function __construct()
        {
            $this->connect('sqlite', array('database' => './database.db'));
        }

        public function connect($db_type, $args)
        {
            try
            {
                switch($db_type)
                {
                    case 'mysql':
                        $this->db = new PDO('mysql:host='.$args['host'].';dbname='.$args['database'], $args['username'], $args['password']);
                        break;

                    case 'sqlite':
                        $this->db = new PDO('sqlite:'.$args['database']);
                        break;

                    case 'pgsql':
                        $this->db = new PDO('pgsql:dbname='.$args['database'].';host='.$args['database'], $args['username'], $args['password']);
                        break;

                    default:
                        return false;
                        break;
                }
            }
            catch(PDOException $e)
            {
                echo $e->getMessage();
            }
        }
    }
?>

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 22-11 16:12
Je custom PDO class moet gewoon de PDO class extenden. Dan heb je dus een subtype van PDO, en kun je gewoon op je (custom) subtype queries preparen en dergelijken.

Je zou in jouw geval dus een hiërarchie kunnen maken waarin je een MySqlPdo, SqlLitePdo en PgSqlPdo class hebt, die allemaal extenden vanaf PDO. Eventueel kun je dan weer ergens een static factory method (oid) maken die aan de hand van een enum de juiste class returnt, maar dat mag je allemaal zelf uitvogelen ;)

[ Voor 49% gewijzigd door Avalaxy op 25-03-2012 01:57 ]


  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 22-11 16:12
Opgelost...?

No offense, maar kijkend naar je posthistory heb ik het idee dat je GoT alleen maar als een helpdesk gebruikt. Het zou chique zijn als je dan ook eventjes zou reageren om te melden of je probleem is opgelost, hoe je het hebt aangepakt, etc.

  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
PHP:
1
2
$db = new PDOConnector()->$db;
$db->query("SQL_QUERY");


Dat zal niet werken?

Verwijderd

YopY schreef op dinsdag 27 maart 2012 @ 10:17:
PHP:
1
2
$db = new PDOConnector()->$db;
$db->query("SQL_QUERY");


Dat zal niet werken?
Dan verlies je de referentie naar PDOConnector ?

Verwijderd

Omdat er nogal wat onduidelijkheid is zie het volgende voorbeeld.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Normaal defineer ik in een config bestand wat mijn db settings zijn
define('DB_TYPE', 'mysql');
define('DB_HOST', 'localhost');
define('DB_NAME', 'someawsomedb');
define('DB_USER', 'root');
define('DB_PASS', '');

class Pdoconnector extends PDO {

    public function __construct() {
        try {
            parent::__construct(DB_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS);

        } catch (PDOException $e) {
          print_r($e->getTrace());
        }

}

$ObjPdo = new Pdoconnector();
$ObjPdo->query("SELECT * FROM users");


Natuurlijk kan je in plaats van defines te gebruiken ook een array doorgeven met de instellingen van je connectie

PHP:
1
2
3
$ArrPropConn = array("Type" => "mysql", enz enz);

$ObjPdo = new Pdoconnector($ArrPropConn);


Hoop dat het nou wat duidelijker is!

  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
Verwijderd schreef op dinsdag 27 maart 2012 @ 10:28:
Dan verlies je de referentie naar PDOConnector ?
PHP:
1
2
3
4
5
<?php 
$connector = new PDOConnector();
$db = $connector->$db; 
$db->query("SQL_QUERY"); 
?>


Misschien begrijp ik de TS niet hoor. Wat ik eruit begrijp is dat hij de functionaliteit van PDOConnector en een database-specifieke PDO instantie in één class will samenvoegen (noem het denormalisatie als je wilt) om 5 karakters per aanroep te besparen. Da's niet nodig, en je wilt jezelf niet in dat soort rare bochten wringen. Kortere code is niet per definitie goed, en d'r is een reden waarom PDOConnector en PDO niet dezelfde class zijn.
Pagina: 1