View Full Version : Switching databases in the middle of a script
minorgod
08-10-2007, 06:12 PM
I'm writing a plugin that will access both the vBulletin db and a different database on the same server. I've gotten it working with the second db by using the standard mysql functions, but I'm trying to clean it up so that it uses only the vBulletin db functions. My question is, can I do this in my plugin to change my selected DB and then change back to the vbulletin db:
//select the alternate db
$this->dbobject->select_db($wp_db_name);
//create the table if necessarry
$query="CREATE TABLE IF NOT EXISTS `".$wp_table_prefix."vbulletin_mappings` (`wp_post_id` INT NOT NULL ,`vb_thread_id` INT NOT NULL) CHARACTER SET = latin1;";
$this->dbobject->query_write($query);
//add some stuff to the new table....
//imagine that there's some kind of insert query here
//then switch back to the original vb db
$this->dbobject->select_db($vb_db_name);
//add the rest of my vb sql stuff here
Also, if someone could tell me the proper vBulletin config variable names for the vBulletin db name/username/password vars, that would be nice. I don't know if I should access them from the global $config array or if there's an $vbulletin->config array I should be accessing instead. Thanks in advance. (And yes, this is yet another Wordpress-vBulletin integration I'm working on).
Bueller?
Knippschild
08-10-2007, 09:24 PM
I'm honestly not 100%, but I believe the second parameter allows you to specify the database resource. Again, i'm not positive on this.
Farcaster
08-10-2007, 09:50 PM
If the mySQL login that vBulletin uses to access the forum database also has access to your second database, you can access both using the same connection. All you need to do is add the database name explicitly before the table.
For instance:
SELECT table1.* FROM myotherdb.table1 table1
minorgod
08-10-2007, 10:17 PM
Thanks for the info. I've been scouring this forum all day and have found info that almost answers my question, but not quite. I finally overcame my laziness and print_r'd the $vbulletin object and figured out my problem. Here's the answer:
The $vbulletin->config array contains all the relevant vars you need to make your standard vBulletin connection, which you need if you want to switch back to the vBulletin db after you switch to a different db:
$vbulletin->config['MasterServer']['servername']
$vbulletin->config['MasterServer']['port']
$vbulletin->config['MasterServer']['username']
$vbulletin->config['MasterServer']['password']
$vbulletin->config['Database']['dbname']
Any plugin options you may have added to any options group via the admin interface can be accessed via $vbulletin->options['my_option_variable_name'].
So to switch databases in my plugin, I basically did this:
global $vbulletin;
//get the config options for the plugin or use the vBulletin db info as default
$wp_db_host = ($vbulletin->options['wp_db_host']?$vbulletin->options['wp_db_host']:$vbulletin->config['MasterServer']['servername']);
$wp_db_username = ($vbulletin->options['wp_db_username']?$vbulletin->options['wp_db_username']:$vbulletin->config['MasterServer']['username']);
$wp_db_password = ($vbulletin->options['wp_db_password']?$vbulletin->options['wp_db_password']:$vbulletin->config['MasterServer']['password']);
$wp_db_name = ($vbulletin->options['wp_db_name']?$vbulletin->options['wp_db_name']:$vbulletin->config['Database']['dbname']);
$wp_table_prefix = ($vbulletin->options['wp_table_prefix']?$vbulletin->options['wp_table_prefix']:"");
$wp_db_port = ($vbulletin->options['wp_db_port']?$vbulletin->options['wp_db_port']:$vbulletin->config['MasterServer']['port']);
//here we connect to our secondary database...
// Connecting to the wordpress db if it's on a different server
if($wp_db_host != $vbulletin->config['MasterServer']['servername']){
$this->dbobject->connect($wp_db_name,$wp_db_host,$wp_db_port,$wp_db _username,$wp_db_password,false);
}
//else just select the wordpress db if it has a different name from the current db.
elseif($vbulletin->config['Database']['dbname'] != $wp_db_name){
$this->dbobject->select_db($wp_db_name);
}
From there you can use the vBulletin db functions to access the secondary db like normal. Then when you're done, you will need to restore the original db connection or at least select the vBulletin DB again, so you would do something like this:
//reconnect to the vBulletin DB if it's on a different server
if($wp_db_host != $vbulletin->config['MasterServer']['servername']){
$this->dbobject->connect(
$vbulletin->config['Database']['dbname'],
$vbulletin->config['MasterServer']['servername'],
$vbulletin->config['MasterServer']['port'],
$vbulletin->config['MasterServer']['username'],
$vbulletin->config['MasterServer']['password'],
$vbulletin->config['MasterServer']['usepconnect'],
$vbulletin->config['SlaveServer']['servername'],
$vbulletin->config['SlaveServer']['port'],
$vbulletin->config['SlaveServer']['username'],
$vbulletin->config['SlaveServer']['password'],
$vbulletin->config['SlaveServer']['usepconnect'],
$vbulletin->config['Mysqli']['ini_file']
);
}
//else reselect the wordpress db
elseif($vbulletin->config['Database']['dbname'] != $wp_db_name){
$this->dbobject->select_db($vbulletin->config['Database']['dbname']);
}
So, that's basically how I'm doing it in my vBulletin-Wordpress bridge. I'm finishing up the plugin now, so I'll post the finished version in case anyone wants to see the full code or use the plugin.
Thanks again to the previous posters for their suggestions. I didn't end up needing them, but they are appreciated nonetheless.
vBulletin® v3.8.12 by vBS, Copyright ©2000-2025, vBulletin Solutions Inc.