tags:

views:

26

answers:

1

I have a set of functions that handle the db connection. I want to add another connection here so I can access a different database at the same time as the current one. Any Suggestions?

The reason I'm looking for a solution is because the script I'm using has very complicated Queries and I would like to be able to simply add the database name in front of it, instead of re-writing the many complicated queries.

Here are the functions that connect to the database:

function db(){

    $this->host = DATABASE_HOST;
    $this->port = DATABASE_PORT;
    $this->socket = DATABASE_SOCK;
    $this->dbname = DATABASE_NAME;
    $this->user = DATABASE_USER;
    $this->password = DATABASE_PASS;
    $this->current_arr_type = MYSQL_ASSOC;

    //  connect to db automatically
    if (empty($GLOBALS['bx_db_link'])) {
        $this->connect();
        $GLOBALS['gl_db_cache'] = array();
        $GLOBALS['bx_db_param'] = array();
    }
    else
        $this->link = $GLOBALS['bx_db_link'];

    if(empty($GLOBALS['bx_db_param']))
        $GLOBALS['bx_db_param'] = new BxDolParams($this);

    $this->oParams = &$GLOBALS['bx_db_param'];
}

/**
 * connect to database with appointed parameters
 */
function connect()
{
    $full_host = $this->host;
    $full_host .= $this->port ? ':'.$this->port : '';
    $full_host .= $this->socket ? ':'.$this->socket : '';

    $this->link = @mysql_pconnect($full_host, $this->user, $this->password);
    if (!$this->link)
        $this->error('Database connect failed', true);

    if (!$this->select_db())
        $this->error('Database select failed', true);

    $this->res("SET NAMES 'utf8'");
    $this->res("SET sql_mode = ''");

    $GLOBALS['bx_db_link'] = $this->link;
}

function select_db()
{
    return @mysql_select_db($this->dbname, $this->link) or $this->error('Cannot complete query (select_db)');
}

/**
 * close mysql connection
 */
function close()
{
    mysql_close($this->link);
}   

Here is an example Query that I don't want to rewrite. I only need to connect to the Profiles Table on a separate database:

$sQuery = "
    SELECT
        `tp`.`ID` as `id`,
        `tp`.`NickName` AS `username`,
        `tp`.`Headline` AS `headline`,
        `tp`.`Sex` AS `sex`,
        `tp`.`DateOfBirth` AS `date_of_birth`,
        `tp`.`Country` AS `country`,
        `tp`.`City` AS `city`,
        `tp`.`DescriptionMe` AS `description`,
        `tp`.`Email` AS `email`,
        DATE_FORMAT(`tp`.`DateReg`,  '" . $sDateFormat . "' ) AS `registration`,
        DATE_FORMAT(`tp`.`DateLastLogin`,  '" . $sDateFormat . "' ) AS `last_login`,
        `tp`.`Status` AS `status`,
        IF(`tbl`.`Time`='0' OR DATE_ADD(`tbl`.`DateTime`, INTERVAL `tbl`.`Time` HOUR)>NOW(), 1, 0) AS `banned`, 
        `tl`.`ID` AS `ml_id`, 
        IF(ISNULL(`tl`.`Name`),'', `tl`.`Name`) AS `ml_name`
        " . $sSelectClause . "
    FROM `Profiles` AS `tp` 
    LEFT JOIN `sys_admin_ban_list` AS `tbl` ON `tp`.`ID`=`tbl`.`ProfID`
    LEFT JOIN `sys_acl_levels_members` AS `tlm` ON `tp`.`ID`=`tlm`.`IDMember` AND `tlm`.`DateStarts` < NOW() AND (`tlm`.`DateExpires`>NOW() || ISNULL(`tlm`.`DateExpires`))  
    LEFT JOIN `sys_acl_levels` AS `tl` ON `tlm`.`IDLevel`=`tl`.`ID` 
    " . $sJoinClause . "
    WHERE
        1 AND (`tp`.`Couple`=0 OR `tp`.`Couple`>`tp`.`ID`)" . $sWhereClause . "
    " . $sGroupClause . "
    ORDER BY `tp`.`" . $aParams['view_order'] . "` " . $aParams['view_order_way'] . "
    LIMIT " . $aParams['view_start'] . ", " . $aParams['view_per_page'];
A: 

You could remodel the class to hold an array of connections, and then add the connection index to each method in your class.

$db->query(1, ".....");
$db->connect(1, "localhost", "username", "password");

An sleek method could be introducing a getConnection() method that selects one of the database connections as the current connection, and then executes your query like so:

$db->getConnection(1)->connect("localhost", "username", "password", "database");
$db->getConnection(1)->query(".....");

the method would have to look something like this:

function getConnection($conn)
 {
  $this->useConnection = $conn;
  return $this;
 }

obviously, for this method, every method in your class would have to be made sensitive of the useConnection property.

Pekka
I'd personally rather see 1 instance per connection (and make `getConnection` static), but you way should work too (it may be a little bit more "fun" to debug, as now you are storing state in the DB object, but it shouldn't be too bad)...
ircmaxell
The thing I'm trying to resolve is to be able to use the LEFT JOINS and all the complicated queries in the script by simply adding the `database`. in front of the table name.
whatshakin
Wait, you mean different database on the same server? If so, use one connection and simply prefix the table with `database.table`...
ircmaxell
ok, there are different users for the tables, is that going to be a problem?
whatshakin
Well, then you'd need to use different connections (if the user the current connection is logged in as doesn't have access)...
ircmaxell