|
Posted by Lόpher Cypher on 01/01/06 03:32
Full Decent wrote:
> Hey all!
>
> I've been using PHP for a while and I'm hearing that I should look into
> using it OO. I'm looking into making changes to the program Camera Life
> (http://fdcl.sf.net). I want to abstract the connection to the database
> which is currently MYSQL and maybe implement another database, or just
> leave it open for addition. If I get lucky and get the hang of this,
> I'd also like to abstract calls to GD.
>
> So firstly, is there a good solution to this problem? I've seen many
> examples, but many of them are incomplete or simply academic. Also,
> will I lose any functionality by doing it this way? I am currently
> using a complicated SELECT statement with a CONCAT. Will this be
> possible with the abstracted class?
>
> Thanks for your consideration,
> FD
>
I would definetely consider it :) For instance, if you use mysql and
then need to move the site to another server with a different dbms, I
bet you'd hate to change all those mysql_* calls :)
So, off the top of the head, I'd go with something like
class DB {
function DB($host,$db,$user,$pwd) {
$this->host = $host;
$this->db = $db;
$this->user = $user;
$this->pwd = $pwd;
}
function connect() {
// abstract
}
...
function query($query) {
// abstract
}
...
}
class DBMySql extends DB {
function connect() {
mysql_connect($this-host,$this->user,$this->pwd);
mysql_select_db($this->db);
}
...
}
class DBPostgreSql extends DB {
function connect() {
pg_connect("host=$this->host dbname=$this->db user=$this->user
password=$this->pwd");
}
...
}
and so on. Then in any place you want to use database, assume you are
using class DB:
....
/**
* @var DB
* @access private
*/
var $db;
....
Then instantiate it to whatever you use:
....
$this->db = new DBMySql("localhost","test","user","pwd");
....
$this->connect(); // works for any database now
....
Then, if you move to another database, simply change which class you
instantiate.
As for the SQL statments, I'd say there could be a problem if the syntax
differs in different dbms. For instance, in Oracle to get current date
one would call sysdate(), and in ms-sql - getdate(). In this case you
may want to consider aliases for function names which are replaced when
query() method is called.
luph
Navigation:
[Reply to this message]
|