我想将wpdb连接到另一个数据库。如何创建实例并将其传递数据库名称/用户名/密码?

感谢

评论

另一个MySQL数据库,还是另一个数据库类型?您是否仍想访问常规的WordPress数据库,还是要将网站从一个数据库移到另一个数据库?

是的,另一个MySQL数据库。它是同一台服务器上的一个单独的数据库,不是Wordpress的。这是一个自定义数据库,其中包含我想在wordpress中显示的信息。

如果使用$ wpdb对象执行此操作,甚至有可能,它将使WordPress其余部分与现有数据库断开连接。所以,不推荐。另一个选择是使用WordPress使用的EZSQL创建新实例。我认为使用EZSQL是因为它是使您不必使用php-pdo-mysql,php-mysql或php-mysqli的抽象层,而不知道可能在给定服务器上安装了哪个。

是的,有可能。可以实例化wpdb以访问任何数据库并查询任何表。

#1 楼

是的,有可能。

wpdb对象可用于访问任何数据库和查询任何表。完全不需要与Wordpress相关,这非常有趣。

好处是可以使用所有wpdb类和函数,例如get_results等,因此无需重新发明轮子。

方法如下:

$mydb = new wpdb('username','password','database','localhost');
$rows = $mydb->get_results("select Name from my_table");
echo "<ul>";
foreach ($rows as $obj) :
   echo "<li>".$obj->Name."</li>";
endforeach;
echo "</ul>";


评论


布阿可惜的是,所有这些评论加在问题本身上,以至于无法正确回答您的问题。

–jerclarke
2010-09-11 20:46

@杰里米·克拉克:我同意。希望我们的压词者更加谨慎,不要无辜地散布虚假信息。

– Wadih M.
2010-09-20 16:27

您还可以使用全局$ wpdb节省时间。但是在触发$ wpdb-> get_results方法之前,必须将wp-load.php包含为:require_once('/ your / wordpress / wp-load.php');

–麦耶少年
2015年9月19日在22:25



通过调用$ mydb-> set_prefix('wp_');设置WPDB前缀以使WP_Query和get_post生成正确的sql查询。

– M-R
15年10月13日在10:58



我知道这是一个旧线程,但是我忍不住用新对象挤压$ mydb变量可能会使连接保持打开状态(我可能错了)。我将检查$ mydb是否已从先前的调用实例化,如果是,则在启动新实例之前关闭连接。例如(对不起,注释中不能做整齐的Markdown代码块):if($ mydb!= null){$ mydb-> close(); }

–乔安娜
1月21日在1:35



#2 楼

在WordPress中,连接第二个数据库很容易,您只需创建WPDB类的新实例,并以与使用我们都知道并喜欢的标准$ wpdb实例相同的方式使用它。

假设第二个数据库具有与主WP相同的登录信息,您甚至可以使用wp-config.php中的预定义常量来避免对登录信息进行硬编码。

/**
 * Instantiate the wpdb class to connect to your second database, $database_name
 */
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
 * Use the new database object just like you would use $wpdb
 */
$results = $second_db->get_results($your_query);


评论


这对于Wadih的回答来说有些多余,但是我认为我的代码示例更加清晰,并且记住db登录常数也很重要,因为它们几乎总是正确的使用方式,否则在从dev-> stage-转移时,您可能会遇到问题>实时环境,登录详细信息可能会更改。

–jerclarke
2010-09-11 20:55

通过调用$ second_db-> set_prefix('wp_');设置WPDB前缀以使WP_Query和get_post生成正确的sql查询。

– M-R
15年10月13日在10:58

#3 楼

没有人说过这句话,所以我想我会添加一种更简单的方法。

,只要您的其他数据库具有与您的wordpress数据库相同的用户/密码,就可以使用像这样的表名之前的数据库名

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);


评论


根据我的经验,这仅适用于获取数据,即使用SELECT。您不能插入数据。

–保护者一
15年6月28日在15:06

它在外部不起作用,

– Wasim A.
19年1月31日在13:57

#4 楼

尽管这些将起作用,但是您将失去使用“其他”自定义功能(如get_post_custom和wordpress查询)的能力。一个简单的解决方案是

$wpdb->select('database_name');


,它可以在系统范围内更改数据库(一个mysql select_db)。如果只想进行简单查询,则使用database.table方法,但是如果要访问另一个wordpress博客,则可以使用select。完成后,您只需将其更改回去,否则您的博客可能会做一些奇怪的事情。

评论


我正在使用此解决方案,并且效果很好,除了一件事。由于某些未知原因,wp_get_post_terms()似乎未使用新选择的数据库?我尝试过的所有其他函数(例如get_post_meta(),get_posts()等)似乎都可以正常工作,但wp_get_post_terms()似乎可以用于DB_NAME数据库。有任何想法吗?

–动力浮标
2013年7月9日在2:54



#5 楼

我还不能发表评论,但是我想扩展Wadih M.的答案(很棒)。

WP的数据库类是Justin Vincent的ezSQL的自定义版本。如果您喜欢该界面,并且想要创建一个非基于WordPress的网站,则可能需要查看一下:http://justinvincent.com/ezsql

评论


ezSQL对我真的很沮丧,来自WPDB。没有“准备”语句,没有“插入”或“更新” ...我喜欢使用整个WPDB类,因为可以通过在项目中包含BackPress中的几个文件来实现。

– Goldenapples
11年4月22日在19:23

@gabrielk链接已死-新链接为:[1] [1]:justinvincent.com/ezsql

–十六进制
13年11月23日在8:20



#6 楼

我正在努力使用$wpdb从需要更新两个博客的父站点连接到第二个博客数据库。我使用$wpdb->select($dbname, $dbh)选择了第二个数据库,但是我仍然从第一个数据库中获得结果。

我通过在第二个数据库上调用WP函数之前调用wp_cache_flush()清除WordPress缓存来解决此问题。