คุณเตรียมงบ% LIKE% SQL อย่างถูกต้องอย่างไร


34

ฉันต้องการใช้คำสั่ง LIKE% text% ในขณะที่ยังคงใช้คลาส WordPress $ wpdb เพื่อฆ่าเชื้อและเตรียมการป้อนข้อมูล

SELECT column_1 from `prefix_my_table` WHERE column_2 LIKE '%something%';

ฉันได้ลองทำสิ่งนี้เพื่อประโยชน์:

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %s;", like_escape($number_to_put_in_like));

คุณเตรียมคำสั่ง% LIKE% SQL อย่างถูกต้องโดยใช้คลาสฐานข้อมูล WordPress อย่างไร

คำตอบ:


49

$wpdb->esc_likeฟังก์ชั่นที่มีอยู่ใน WordPress เพราะฐานข้อมูลปกติหลบหนีไม่ได้หลบหนี%และ_ตัวอักษร ซึ่งหมายความว่าคุณสามารถเพิ่มพวกเขาในการโต้แย้งของคุณไปwpdb::prepare()โดยไม่มีปัญหา นี่คือสิ่งที่ฉันเห็นในรหัส WordPress หลัก :

$wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');

ดังนั้นรหัสของคุณจะมีลักษณะดังนี้:

$wpdb->prepare(
    "SELECT
        column_1
    FROM
        `{$wpdb->base_prefix}my_table`
    WHERE
        column_2 LIKE %s;",
    '%' . $wpdb->esc_like($number_to_put_in_like) . '%'
);

คุณยังสามารถเพิ่ม%%ในแบบสอบถามเพื่อรับตัวอักษร%( wpdb::prepare()ใช้vsprintf()ในพื้นหลังซึ่งมีไวยากรณ์นี้ ) แต่โปรดจำไว้ว่าสตริงของคุณจะไม่ถูกยกมาคุณต้องเพิ่มคำพูดด้วยตัวคุณเอง (ซึ่งไม่ใช่สิ่งที่คุณต้องทำwpdb::prepare().


มีไว้{}เพื่ออะไร
Francisco Corrales Morales

@FranciscoCorralesMorales: เพื่อระบุว่าทุกสิ่งที่อยู่ภายในนั้นควรได้รับการพิจารณาว่าเป็นนิพจน์ตัวแปรมิฉะนั้นจะเห็น$wpdbและไม่สนใจสิ่ง->prefixต่อไปนี้
Jan Fabry

1
@JanFabry ปิด ฉันจะแก้ไขความคิดเห็นจะพูดว่า:" ... มิฉะนั้นก็จะเห็นทั้งหมดของ$wpdb->base_prefixmy_tableและพยายามที่จะมองขึ้นไปbase_prefixmy_tableสถานที่ให้บริการแทนเพียงbase_prefix.
Flimm

3

คุณจำเป็นต้องร้อยละสองครั้งเพื่อให้พวกเขาได้รับการปฏิบัติไม่เหมือนเครื่องหมายส่วนโดยwpdb->prepare():

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %%%s%%;", $wpdb->esc_like( $number_to_put_in_like));

ป.ล. ไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุด / เท่านั้นที่จะทำ


4
โปรดจำไว้ว่าคุณต้องเพิ่มคำพูดรอบสตริงตัวเองเพราะwpdb::prepareจะเพิ่มพวกเขาหา%s%ที่ไม่ได้นำหน้าด้วย WHERE column_2 LIKE '%%%s%%'ส่วนสุดท้ายของการค้นหาของคุณควรจะ
Jan Fabry

2

นี่เป็นวิธีหนึ่งในการทำสิ่งที่ฉันได้ตรวจสอบและใช้งานได้:

$search_text = "%" . $_GET['some_text'] . "%";

$user_count = $wpdb->get_var( 
    $wpdb->prepare( 
        "SELECT COUNT(*) FROM mix_library WHERE ml_setting_name LIKE %s", 
        $search_text 
    ) 
);

แทนที่ตัวแปรให้เหมาะกับความต้องการของคุณ


5
คุณควรหลีกเลี่ยง%อักขระ (โดยใช้like_escape()ดูที่: codex.wordpress.org/Class_Reference/ ......
Stephen Harris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.