wpdb를 사용하여 별도의 데이터베이스에 연결


86

wpdb다른 데이터베이스 에 연결하고 싶습니다 . 인스턴스를 작성하고 데이터베이스 이름 / 사용자 이름 / 암호를 전달하려면 어떻게해야합니까?

감사


다른 MySQL 데이터베이스 또는 다른 데이터베이스 유형? 여전히 일반 WordPress 데이터베이스에 액세스하려고합니까, 아니면 한 DB에서 다른 DB로 사이트를 옮기고 있습니까?
EAMann

1
예, 다른 MySQL 데이터베이스입니다. 같은 서버에있는 별도의 DB이며 Wordpress가 아닙니다. 워드 프레스 내부에 표시하려는 정보가있는 사용자 정의 DB입니다.
와디 M.

1
$ wpdb 객체로 그렇게했다면 가능하다면 기존 WordPress에서 나머지 WordPress의 연결을 끊습니다. 따라서 권장하지 않습니다. 또 다른 옵션은 WordPress에서 사용하는 EZSQL을 사용하여 새 인스턴스를 만드는 것입니다. EZSQL은 php-pdo-mysql, php-mysql 또는 php-mysqli를 사용하지 않아도 주어진 서버에 설치되어 있는지 알지 못하는 계층이기 때문에 사용됩니다.
Volomike

3
네 가능합니다. wpdb를 인스턴스화하여 모든 데이터베이스에 액세스하고 테이블을 쿼리 할 수 ​​있습니다.
와디 M.

답변:


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

@Jeremy Clarke : 동의합니다. 동료 워드 프레 서가 정보를 무고하게 퍼 뜨리지 않도록 더 조심해야합니다.
Wadih M.

1
을 사용하여 시간을 절약 할 수도 있습니다 global $wpdb. 그러나 $ wpdb-> get_results 메소드를 실행하기 전에 다음과 같이 wp-load.php를 포함시켜야합니다. require_once('/your/wordpress/wp-load.php');
Junior M

다음을 호출하여 WP_Query 및 get_post가 올바른 SQL 쿼리를 생성하도록 WPDB 접두사를 설정하십시오.$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 로그인 상수를 기억하는 것이 중요합니다 .DB 로그인 상수는 거의 항상 사용하기에 적당하며 그렇지 않으면 dev-> stage- > 로그인 정보가 변경 될 수있는 실제 환경.
jerclarke

다음을 호출하여 WP_Query 및 get_post가 올바른 SQL 쿼리를 생성하도록 WPDB 접두사를 설정하십시오.$second_db->set_prefix('wp_');
MR

21

아무도 이것을 말하지 않았으므로 더 쉬운 방법을 추가 할 것이라고 생각했습니다 ..

추가 데이터베이스에 워드 프레스 데이터베이스와 동일한 사용자 / 패스 세부 정보가있는 한 테이블 이름 앞에 데이터베이스 이름을 사용할 수 있습니다.

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

내 경험상, 이것은 데이터 를 얻는 것 , 즉 SELECT. 데이터를 삽입 할 수 없습니다.
수호자 1

외부에서 작동하지 않습니다.
Wasim A.

7

이러한 기능은 작동하지만 get_post_custom 및 wordpress 쿼리와 같은 "기타"사용자 정의 기능을 사용할 수 없게됩니다. 간단한 해결책은

$wpdb->select('database_name');

데이터베이스 전체의 데이터베이스를 변경합니다 (mysql select_db). database.table 메소드는 간단한 쿼리를 원하지만 다른 워드 프레스 블로그에 액세스하려는 경우 select를 사용할 수 있습니다. 완료되면 다시 변경해야합니다. 그렇지 않으면 블로그가 이상한 일을 할 수 있습니다.


나는이 솔루션을 사용하고 있으며 한 가지를 제외하고는 훌륭하게 작동합니다. 알려지지 않은 이유로 wp_get_post_terms()새로 선택된 DB를 사용하지 않는 것 ?? 내가 시도한 다른 모든 기능 (예 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에서 나에게 정말 실망했습니다. "prepare"문, "insert"또는 "update"없음 ... 전체 WPDB 클래스를 그대로 사용하고 싶습니다. 프로젝트에 BackPress에서 몇 개의 파일을 포함 시켜서 가능합니다.
goldenapples

죽은 링크 @gabrielk - 새로운 인 [1] [1] : justinvincent.com/ezsql
Hexodus

4

$wpdb두 개의 블로그를 업데이트해야하는 상위 사이트에서 두 번째 블로그 데이터베이스에 연결하는 데 어려움을 겪고있었습니다 . 내가 사용하는 $wpdb->select($dbname, $dbh)두 번째 데이터베이스를 선택,하지만, 난 여전히 첫 번째 데이터베이스의 결과를 얻고 있었다.

wp_cache_flush()두 번째 데이터베이스에서 WP 함수를 호출하기 전에 WordPress 캐시를 지우도록 호출하여 문제를 해결했습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.