0

I am making my first steps in the OOP world - please bear with me.
I know that having many ongoing mySQL connections open at the same time can be fatal for performance, so it should be a good idea to make a database class that takes this into account.

Is $this->session->write(...); going to result in a new mySQL connection being opened each time? Or is that up to the "persistent connection" feature in mySQL?

Here's the code:

abstract class database {
    function __construct() {
       //mysql_connect()
    }
}

class session extends database {
    function write () {
       // mysql_query(--.)
    }
}
hakre
  • 193,403
  • 52
  • 435
  • 836
Industrial
  • 41,400
  • 69
  • 194
  • 289

3 Answers3

1

mysql_query will create a new connection only if no previous mysql connection has been made. Otherwise, it will either use the connection you specify or the last connection opened with mysql_connect. http://php.net/manual/en/function.mysql-query.php

Rachel McMahan
  • 392
  • 1
  • 8
1

Is session handler some kind of specialized type of database? It is not, so don't use inheritance (a is a relationship). Session handler uses database so you should use composition (a has a relationship):

class Session {
    protected $db;

    public function __construct(DB $db) {
        $this->db = $db;
    } 

    public function write() {
        $this->db->query(...);
    }
}


$db = new DB(...);
$session = new Session($db);

Also, don't use mysql_*() functions. Use much more powerful PDO.


Returning to your question... mysql_connect() will be executed every time you create a new Database object. However in this case Session is an object of type Database so every time you write new Database() or new Session() the constructor is invoked, therefore mysql_connect() is invoked as well.

PS. mysql_connect() function won't create a new connection if specified connection already exists. Check 4th argument of this function to learn more.

Crozin
  • 43,890
  • 13
  • 88
  • 135
  • Hi Crozin, is there a good way of doing like your example, but having the `$db`-variable in `new Session($db);` set once only in my code, so I do not need to load it into every class that's dependent on the database class each time? Great pic btw :) – Industrial Feb 10 '11 at 17:16
  • Also - is this http://stackoverflow.com/questions/1716652/database-and-oop-practices-in-php/1716953#1716953 also a solution to this? (Singleton pattern) – Industrial Feb 10 '11 at 17:19
  • Singleton might seem to be a cool, fast solution but it's a horrible idea to use it here. Here, you're dealing with [dependecny injection](http://www.google.com/search?client=opera&rls=en&q=dependency+injection&sourceid=opera&ie=utf-8&oe=utf-8). If passing dependencies manually become irritable or illegible consider using [DIC](http://www.google.com/search?hl=en&safe=off&client=opera&hs=ylG&rls=en&q=dependency+injection+container&aq=f&aqi=g4g-m5&aql=&oq=) – Crozin Feb 10 '11 at 17:49
0

Why not

class database {
    function __construct() {
       //mysql_connect()
    }
    function write() {
       //query the DB
    }
}

I'm not sure of the syntax, I don't do OOP PHP. Anyway, in your structure above a new connection would be opened for each "session" instance so assuming you only create one instance of "session" you won't be openeing loads of database connections.

Dai
  • 1,510
  • 1
  • 11
  • 12