2010-08-27 4 views
0

J'ai un ensemble de fonctions qui gèrent la connexion db. Je veux ajouter une autre connexion ici afin que je puisse accéder à une base de données différente en même temps que celle en cours. Aucune suggestion?Ajout d'une autre connexion db à la fonction

La raison pour laquelle je cherche une solution est parce que le script que j'utilise a des requêtes très compliquées et je voudrais pouvoir simplement ajouter le nom de base de données devant lui, au lieu de réécrire les nombreux requêtes compliquées.

Voici les fonctions qui se connectent à la base de données:

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); 
} 

Voici un exemple de requête que je ne veux pas réécrire. Je ne dois connecter au tableau Profiles sur une base de données séparée:

$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']; 
+3

Si c'est à l'intérieur d'une classe (puisque c'est la seule façon de faire '$ this'), pourquoi utilisez-vous toujours des variables globales (par opposition aux variables membres ou aux variables de classes statiques)? – ircmaxell

+0

Ceux-ci sont utilisés dans une zone différente du script. Je ne l'ai pas écrit, j'essaie juste d'intégrer deux sites différents en utilisant la même table 'Profiles'. – tmartin314

Répondre

0

Vous pouvez remodeler la classe pour tenir un tableau de connexions, puis ajoutez l'indice de connexion à chaque méthode dans votre classe.

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

Une méthode élégante pourrait être l'introduction d'une méthode getConnection() qui sélectionne l'une des connexions de base de données que la connexion en cours, et exécute ensuite votre requête comme ceci:

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

la méthode devrait ressembler à quelque chose comme ceci:

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

évidemment, pour cette méthode, chaque méthode dans votre classe devrait être rendu sensible du useConnection propriété.

+0

Personnellement, je préfèrerais voir 1 instance par connexion (et rendre statique la fonction 'getConnection'), mais vous devriez aussi travailler (cela peut être un peu plus" amusant "de déboguer, car maintenant vous stockez l'état dans l'objet DB , mais ça ne devrait pas être trop mal) ... – ircmaxell

+0

La chose que j'essaie de résoudre est de pouvoir utiliser les JOINTES GAUCHES et toutes les requêtes compliquées du script en ajoutant simplement 'database'. devant le nom de la table. – tmartin314

+0

Attendez, vous voulez dire base de données différente sur le même serveur? Si oui, utilisez une connexion et préfixez simplement la table avec 'database.table' ... – ircmaxell

Questions connexes