การใช้ wpdb เพื่อเชื่อมต่อกับฐานข้อมูลแยกต่างหาก


86

ฉันต้องการเชื่อมต่อwpdbกับฐานข้อมูลอื่น ฉันจะสร้างอินสแตนซ์และส่งผ่านชื่อฐานข้อมูล / ชื่อผู้ใช้ / รหัสผ่านได้อย่างไร

ขอบคุณ


ฐานข้อมูล MySQL อื่นหรือประเภทฐานข้อมูลอื่น? คุณยังต้องการเข้าถึงฐานข้อมูล WordPress ปกติหรือคุณย้ายเว็บไซต์จากฐานข้อมูลหนึ่งไปยังอีกฐานข้อมูลหนึ่งหรือไม่?
EAMann

1
ใช่อีกฐานข้อมูล MySQL มันเป็นฐานข้อมูลแยกต่างหากบนเซิร์ฟเวอร์เดียวกันและไม่ใช่ของ Wordpress มันเป็นฐานข้อมูลที่กำหนดเองพร้อมข้อมูลที่ฉันต้องการแสดงภายในเวิร์ดเพรส
Wadih M.

1
ถ้าคุณทำอย่างนั้นกับวัตถุ $ wpdb ถ้าเป็นไปได้มันจะตัดการเชื่อมต่อส่วนที่เหลือของ WordPress ออกจากฐานข้อมูลที่มีอยู่ ดังนั้นไม่แนะนำ อีกตัวเลือกหนึ่งคือการสร้างอินสแตนซ์ใหม่โดยใช้ EZSQL ซึ่ง WordPress ใช้ ฉันคิดว่า EZSQL ถูกนำมาใช้เพราะมันเป็นเลเยอร์ที่ทำให้คุณไม่ต้องใช้ php-pdo-mysql, php-mysql หรือ php-mysqli โดยไม่รู้ว่าจะติดตั้งบนเซิร์ฟเวอร์ใด
Volomike

3
ใช่มันเป็นไปได้ wpdb สามารถอินสแตนซ์เพื่อเข้าถึงฐานข้อมูลใด ๆ และสืบค้นตารางใด ๆ
Wadih 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
Booyah น่าเสียดายที่ความคิดเห็นเหล่านั้นรวมอยู่ในคำถามเพื่อบล็อกคำตอบที่ถูกต้องของคุณ
jerclarke

@ Jeremy Clarke: ฉันเห็นด้วย การหวังให้เพื่อนร่วมเวิร์ดเพรสเกอร์ของเรานั้นระมัดระวังที่จะไม่แพร่กระจายข้อมูลที่ไร้เดียงสาอย่างไร้เดียงสา
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 เพื่อสร้างแบบสอบถาม SQL ที่ถูกต้องโดยโทร$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 เนื่องจากเป็นค่าที่ถูกต้องในการใช้งานและคุณเสี่ยงต่อการย้ายจากเวที > สภาพแวดล้อมจริงที่อาจมีการเปลี่ยนแปลงรายละเอียดการเข้าสู่ระบบ
jerclarke

ตั้งค่าคำนำหน้า WPDB เพื่อสร้าง WP_Query และ get_post เพื่อสร้างแบบสอบถาม SQL ที่ถูกต้องโดยโทร$second_db->set_prefix('wp_');
MR

21

ไม่มีใครพูดเรื่องนี้ดังนั้นฉันคิดว่าฉันจะเพิ่มวิธีที่ง่ายยิ่งขึ้น ..

ตราบเท่าที่ฐานข้อมูลเพิ่มเติมของคุณมีรายละเอียดผู้ใช้ / รหัสผ่านเดียวกันเพื่อเข้าถึงฐานข้อมูลของคุณคุณสามารถใช้ชื่อฐานข้อมูลหน้าชื่อตารางเช่นนี้

$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');

ซึ่งเปลี่ยนระบบฐานข้อมูลทั่วทั้งระบบ (a 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 เป็น ezSQL รุ่นที่กำหนดเองของ Justin Vincent หากคุณชอบอินเทอร์เฟซและคุณต้องการทำเว็บไซต์ที่ไม่ได้ใช้เวิร์ดเพรสคุณอาจต้องการลองดู: 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()เพื่อล้างแคช WordPress ก่อนเรียกฟังก์ชั่น WP ในฐานข้อมูลที่สอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.