จำเป็นต้องใช้คำนำหน้า $ wpdb-> ในตารางที่กำหนดเองหรือไม่


16

ขออภัยหากคำถามนี้เล็กน้อย ฉันเพิ่งเริ่มพัฒนาปลั๊กอินใน WordPress

ในบทเรียนทั้งหมดที่ฉันพบนี้: ในขณะที่สร้างตารางที่กำหนดเอง$wpdb->prefixถูกนำมาใช้

ตัวอย่าง:

$table_name = $wpdb->prefix . "liveshoutbox";

คำถามของฉัน:

จำเป็นต้องใช้$wpdb->prefixหรือไม่? จะเกิดอะไรขึ้นถ้าฉันไม่ใช้คำนำหน้าสำหรับตารางที่กำหนดเองของฉัน

คำตอบ:


22

มันเป็นข้อบังคับแม้ว่าจะไม่ได้บังคับใช้

พิจารณาสถานการณ์สมมติเมื่อไซต์ Wordpress สองไซต์ถูกติดตั้งในฐานข้อมูลเดียวกัน หนึ่งที่มีคำนำหน้าwp_และอื่น ๆ wp2_ด้วย หากคุณติดตั้งปลั๊กอินในทั้งสองไซต์ด้วยคำนำหน้าตารางที่คุณสร้างขึ้นจะเป็นwp_liveshoutboxไซต์แรกและwp2_liveshoutboxสำหรับไซต์ที่สอง แต่ถ้าคุณไม่ใส่คำนำหน้าทั้งสองไซต์จะใช้ตารางชื่อเดียวกันliveshoutboxและทุกสิ่งจะเลิกกัน


12
ในคำอื่น ๆมันมีผลบังคับใช้ :)
Rarst

4

พิจารณาสิ่งต่อไปนี้:

ปลั๊กอินของคุณใช้กับเครือข่าย wordpress ซึ่งใช้คำนำหน้าตารางที่แตกต่างกันสำหรับแต่ละไซต์ ปลั๊กอินของคุณอาจทำงานพร้อมกันในเว็บไซต์ต่าง ๆ 836 แห่งซึ่งอยู่ในฐานข้อมูลเดียวกัน wp_385677_liveshoutboxเป็นชื่อตารางที่เหมาะสมอย่างสมบูรณ์

ปลั๊กอินของคุณถูกติดตั้งโดยผู้ใช้ที่มีแนวคิดเรื่องความปลอดภัยและได้เปลี่ยนคำนำหน้าตารางเพื่อบล็อกบอทที่พยายามแทรกselect * from wp_usersเข้าไปในระบบ แม้ว่าพวกเขาจะพบช่องโหว่ใหม่มันก็ไม่ทำงาน

การใช้ทางลัดเช่นชื่อตาราง hardcoding เป็นวิธีที่ดีในการทำให้ผลิตภัณฑ์ทำงานได้ แต่ไม่ใช่วิธีที่ดีในการเผยแพร่ ในช่วงเวลาสั้น ๆ ปลั๊กอินจะมีความคิดเห็นที่ "ไม่ทำงาน" อยู่ในกรณีที่เลวร้ายที่สุดคุณจะทำลายไซต์ของบุคคลอื่น

หากฉันมีข้อความค้นหาที่ซับซ้อนและฉันไม่ต้องการจัดการกับความเจ็บปวดในการเขียน'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....คุณสามารถใช้ replacers ได้ ตัวอย่างเช่น:

$query = 'select foo from %table% left join %meta% on %table%.ID = %meta%.meta_id ... ';

$change = array (
    '%table%' => $wpdb->prefix . '_mytable',
    '%meta%'  => $wpdb->prefix . '_mytablemeta'
    );


$sql = str_replace( array_keys( $change ), array_values( $change ), $query );

$results = $wpdb->get_results( $sql );

Wordpress เปลี่ยนแปลงอยู่ตลอดเวลา สิ่งที่ "ใช้งาน" ในวันนี้อาจไม่ทำงานในวันพรุ่งนี้ นั่นเป็นเหตุผลที่มีฟังก์ชั่น API นักพัฒนา Wordpress จะทำให้แน่ใจว่าพฤติกรรม API สาธารณะนั้นสอดคล้องกัน (หรือพวกเขาจะคิดค่าเสื่อมราคาของฟังก์ชัน) หากคุณเริ่มใช้การเรียกใช้วิธีการภายในเพราะ 'เร็วกว่าวิธีนั้น' มักจะกลับมากัดคุณ มีซอฟต์แวร์ช็อตคัทที่แท้จริงน้อยมาก - พวกเขาเพียงแค่ย้ายงานที่ต้องการจากนี้ไปสู่ในภายหลังและเช่นเดียวกับบัตรเครดิตของคุณ "ในภายหลัง" มักจะมีค่าใช้จ่ายมากขึ้น


เนื่องจากสิ่งนี้กล่าวถึง multisite องค์ประกอบเพิ่มเติมที่ควรทราบว่าฉันไม่เห็นคำตอบคือการใช้$wpdb->prefix . "users"จะทำให้ตารางไม่ถูกต้องในการติดตั้งหลายไซต์ นั่นเป็นเพราะมันจะติดคำนำหน้า db ลงในตาราง อย่างไรก็ตามมัลติไซต์ใช้ตารางผู้ใช้เดียวเท่านั้นเนื่องจากผู้ใช้ทั้งหมดเป็นผู้ใช้เครือข่าย ดังนั้นหากแบบสอบถามเกี่ยวข้องกับตาราง wp_users หรือ wp_usermeta คุณต้องใช้$wpdb->usersหรือ$wpdb->usermetaตามลำดับ
butlerblog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.