使用wpdb连接到单独的数据库


86

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

谢谢


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

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

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

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

Answers:


138

是的,有可能。

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>";

3
布阿 糟糕的是,所有这些评论加在问题本身上,以致无法准确回答。
jerclarke 2010年

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

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

设置WPDB前缀以使WP_Query和get_post通过调用$mydb->set_prefix('wp_');
MR

30

在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年

设置WPDB前缀以使WP_Query和get_post通过调用$second_db->set_prefix('wp_');
MR

21

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

只要您的其他数据库具有与wordpress数据库相同的用户/访问详细信息即可访问它,则可以在表名之前使用数据库名,如下所示

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

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

它不能在外部工作,
Wasim A.

7

尽管这些将起作用,但是您将失去使用“其他”自定义功能(如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数据库。有任何想法吗?
powerbuoy

7

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

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


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

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

4

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.