ฉันควรใช้การเตรียม wpdb หรือไม่


28

ฉันใหม่กับ SQL และฉันสงสัยว่าถ้าฉันต้องใช้wpdb->prepareสำหรับแบบสอบถามต่อไปนี้ในตารางที่ฉันสร้างขึ้น

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );

ฉันจำเป็นต้องใช้prepareที่นี่หรือไม่? ฉันจะทำอย่างไร

ไชโย

คำตอบ:


33

เป็นแนวปฏิบัติที่ดีที่สุดที่จะใช้งานตลอดเวลาprepareแต่การใช้งานหลักคือเพื่อป้องกันการโจมตีจากการฉีด SQL และเนื่องจากไม่มีการป้อนข้อมูลจากผู้ใช้ / ผู้เข้าชมหรือไม่สามารถส่งผลต่อแบบสอบถามได้

แต่อย่างที่ฉันพูดไว้ก่อนหน้านี้คือวิธีปฏิบัติที่ดีที่สุดที่จะใช้และเมื่อคุณเริ่มใช้คุณไม่เคยหยุดดังนั้นในตัวอย่างของคุณคุณสามารถใช้มันได้เช่น:

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );

เพื่ออ่านเพิ่มเติมเกี่ยวกับวิธีใช้หัวเพื่อcodex


สวัสดี @Bainternet ขอบคุณสำหรับคำอธิบายที่ชัดเจน - ด้วยเหตุผลบางอย่างเมื่อฉันลองใช้โค้ดของคุณมันจะส่งคืนอาร์เรย์ว่าง ฉันได้ตรวจสอบและตรวจสอบความผิดพลาดเป็นสองเท่าแล้ว ถ้าฉันทำแบบสอบถามไม่ได้เตรียมตัวไว้ฉันจะได้รับอาร์เรย์ ฉันไม่เข้าใจว่าทำไมมันไม่ทำงาน .. !
Richard Sweeney

แปลก ฉันลองใช้รหัสเดียวกันกับข้อความค้นหาอื่น: $tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); และมันก็ใช้งานได้ดี ไม่แน่ใจว่าทำไมถึงเป็นเช่นนั้น แต่ฉันได้รับมันตอนนี้ในกรณีใด ๆ !
Richard Sweeney

6
การใส่ชื่อตารางในเครื่องหมายคำพูดเดี่ยวจะไม่ทำงาน หนีตามปกติอยู่กับ backticks SELECT * FROM `wp_my_custom_table`เพื่อให้การค้นหาของคุณควรจะจบลงมองเช่นนี้ คุณสามารถเปิดใช้การสนับสนุนราคาคู่ SELECT * FROM "wp_my_custom_table"แต่แล้วมันจะต้องมีลักษณะเช่นนี้
Jan Fabry

3
ฉันไม่เห็นด้วยกับคำตอบนี้ ทำไมคุณควรหนีเมื่อฟังก์ชั่นหลบหนีไปแล้วทุกอย่าง? คุณคิดว่า Wordpress จะตัดสินใจลบการหลบหนีออกจากแกนหรือไม่ นอกจากนี้ยังไม่มีจุดที่จะหลบหนีชื่อตาราง :) เพราะมันเป็นฮาร์ดโค้ดและคุณรู้ว่ามันโอเค ฉันรู้ว่านี่เป็นเพียงตัวอย่าง แต่ยังไงก็ตามอย่าหลบหนีชื่อตารางฉันมีปัญหาเมื่อใช้เตรียมกับชื่อตารางมันเพิ่ม backticks และข้อผิดพลาด SQL trows
Tommixoft

@Tommixoft หากคุณอ่านคำตอบอีกครั้งคุณจะเห็นว่าคุณพูดในสิ่งเดียวกันกับที่ฉันพูดและชื่อตารางเป็นตัวอย่าง
Bainternet

0

เมื่อคุณใช้การเตรียมตัวจะเป็นการป้องกันโค้ดจากช่องโหว่การฉีด SQL

นี่คือรหัสที่คุณต้องแก้ไขเพื่อใช้prepare();

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );

0

ในกรณีของคุณเป็นไปไม่ได้โจมตีฉีด SQL รหัสของคุณไม่ต้องการการป้องกันเพิ่มเติมเนื่องจากไม่ได้ใช้การป้อนข้อมูลของผู้ใช้เช่น: โพสต์, รับ, ร้องขอ, คุกกี้

อย่าใช้ฟังก์ชั่นที่ซับซ้อนเมื่อไม่จำเป็นต้องประหยัดทรัพยากรเซิร์ฟเวอร์

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