Добавление еще одного подключения БД для функции

0

У меня есть набор функций, которые обрабатывают соединение db. Я хочу добавить здесь другое соединение, чтобы я мог обращаться к другой базе данных одновременно с текущей. Какие-либо предложения?

Причина, по которой я ищу решение, состоит в том, что я использую script очень сложные запросы, и я хотел бы просто добавить имя базы данных перед ней, вместо того, чтобы переписывать много сложных запросов.

Вот функции, которые подключаются к базе данных:

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

Вот пример запроса, который я не хочу переписывать. Мне нужно только подключиться к таблице Profiles в отдельной базе данных:

$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
    Если это внутри класса (так как это единственный способ сделать $this ), почему вы все еще используете глобальные переменные (в отличие от переменных-членов или статических переменных класса)?
  • 0
    Они используются в другой области сценария. Я не писал, я просто пытаюсь объединить два разных сайта, используя одну и ту же таблицу Profiles .
Теги:

1 ответ

0
Лучший ответ

Вы можете переделать класс для хранения массива подключений, а затем добавить индекс подключения к каждому методу в своем классе.

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

В гладком методе может быть введен метод getConnection(), который выбирает одно из соединений с базой данных в качестве текущего соединения, а затем выполняет ваш запрос следующим образом:

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

метод должен выглядеть примерно так:

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

очевидно, для этого метода каждый метод в вашем классе должен быть чувствителен к свойству useConnection.

  • 0
    Лично я предпочел бы видеть 1 экземпляр для каждого соединения (и сделать getConnection статическим), но ваш путь тоже должен работать (это может быть немного более "забавно" для отладки, так как теперь вы сохраняете состояние в объекте DB, но это не должно быть слишком плохо) ...
  • 0
    То, что я пытаюсь решить, - это возможность использовать ЛЕВЫЕ СОЕДИНЕНИЯ и все сложные запросы в сценарии, просто добавив database . перед именем таблицы.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню