Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Useampi tietokanta ja PDO

BC1 [29.11.2011 20:08:42]

#

Tein lähempää tuttavuutta PDO:n kanssa ja ajattelin siirtää omat sovellukseni käyttämään sitä sen merkittävien etujen vuoksi. Mikä olisi kätevin tapa saada PDO:sta väännettyä oma MyPDO -luokka, jolla voisi näppärästi hallita useita tietokantoja kerralla?

Lähes poikkeuksetta sovellukseni käyttää useita erillisiä tietokantoja, joihin sovelluksen kukin toiminto muodostaa yhteyden vain tarvittaessa. Tässä vaiheessa en mielelläni lähtisi puristamaan tietokantoja yhteen tietokantaan -- lisäksi koen paremmaksi että toiminto on yhteydessä vain niihin tietokantoihin joita se tarvitsee (mm. tietoturvan osalta).

Ajattelin jotain tämän tyylistä:

   $db = new MyPDO();

// Tietokantoihin yhteyden muodostaminen vain
// tietokannan lempinimellä (yhteysasetukset haetaan siis
// asetustiedostoista lempinimellä).

   $db->newConnection("yksi_tietokanta");
   $db->newConnection("toinen_tietokanta");
   $db->newConnection("kolmas_tietokanta");

// Tietokantakyselyn suorittaminen

   $db->selectConnection("toinen_tietokanta");
   $posts = $db->queryAll('SELECT * FROM post ' .
                          'WHERE userId = ? ' .
                          'ORDER BY posttime DESC',
                          array($_REQUEST['uid']));

Eli siis periaatteessa ajattelin mallia, jossa MyPDO:lla avatut yhteydet kasattaisiin altaaseen. Ennen tietokantakyselyä vaan valitaan altaasta oikea yhteys ja suoritetaan kysely kuten normaalistikin PDO:lla tehtäisiin.

Mietin vain, että millä tavalla pitäisi lähteä tuota MyPDO:ta tekemään, jotta tuollaisen "yhteysaltaan" rakentaminen onnistuisi?

$db["yhteys"] = new PDO(---); -tyylinen ratkaisu ei houkuttaisi... vaikka periaatteessa toimisihan tuokin. Mutta minusta MyPDO -tyyli olisi selkeämpi kokonaisuutta ajatellen.

Ideoita, vinkkejä, kommentteja... neuvoja? - Kiitos.

Metabolix [29.11.2011 20:16:30]

#

Toteutuksessa ei ole mitään olennaista eroa verrattuna siihen, miten sama tehtäisiin ilman PDO:ta: luot vain luokan sisällä useamman PDO-olion. Mikä siis oli oikeastaan kysymyksesi?

Ilmeisesti haet jotain tällaista:

class MyPDO {
	private $connections = array();
	private $current = null;

	public function newConnection($name) {
		$this->connections[$name] = new PDO(...);
		$this->selectConnection($name);
	}

	public function selectConnection($name) {
		$this->current = $this->connections[$name];
	}

	public function queryAll($query, $params = array()) {
		$statement = $this->current->prepare($query);
		$statement->execute($params);
		return $statement->fetchAll();
	}
}

BC1 [30.11.2011 00:24:28]

#

Kiitos. Lähdin taas tapani mukaan ajattelemaan asiaa aivan liian monimutkaisesti ja olin tekemässä jos jonkinlaisia viritelmiä... yksinkertaisuus on kaunista.

Kysymykseni oli siis juuri tuo, että mikä tapa olisi järkevin lähteä tekemään tuota kaipaamaani PDO-sovelmaa.

Suuret kiitokset sinulle ajatteluni selkeyttämisestä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta