আপনি কীভাবে% LIKE% SQL স্টেটমেন্টটি সঠিকভাবে প্রস্তুত করেন?


34

ইনপুট স্যানিটাইজ এবং প্রস্তুত করতে এখনও ওয়ার্ডপ্রেস। ডাব্লুপিডিবি ক্লাস ব্যবহার করার সময় আমি একটি লাইক% টেক্সট% বিবরণ ব্যবহার করতে চাই।

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 স্টেটমেন্টটি সঠিকভাবে প্রস্তুত করবেন?

উত্তর:


49

$wpdb->esc_likeফাংশন ওয়ার্ডপ্রেস বিদ্যমান কারণ নিয়মিত ডাটাবেসের পলায়নের অব্যাহতি না %এবং _অক্ষর। এর অর্থ আপনি wpdb::prepare()সমস্যা ছাড়াই আপনার যুক্তিগুলিতে এগুলি যুক্ত করতে পারেন । এই হল কি আমি কোর ওয়ার্ডপ্রেস কোডে দেখুন :

$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()


কি {}জন্য?
ফ্রান্সিসকো

@ ফ্রেঞ্চিসকো কররেলেস মোরেলস: এটি নির্দেশ করার জন্য যে এর অভ্যন্তরের সমস্ত কিছুকে একটি পরিবর্তনশীল ভাব হিসাবে বিবেচনা করা উচিত , অন্যথায় এটি কেবল দেখতে পাবে $wpdb, এবং ->prefixতারপরে এটি উপেক্ষা করবে।
জান ফ্যাব্রি

1
নিবন্ধন করুন আমি মন্তব্য সংশোধন হবে বলে: "... অন্যথায় এটি সব দেখতে হবে $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));

পিএস নিশ্চিত নয় যে এটি করা সেরা / একমাত্র উপায় sure


4
মনে রাখবেন যে স্ট্রিংয়ের চারপাশে আপনাকে অবশ্যই উদ্ধৃতিগুলি যুক্ত করতে হবে , কারণ wpdb::prepareএটি কেবলমাত্র এমনটির জন্য যুক্ত করবে %sযা কোনও পূর্ববর্তী নয়% । আপনার ক্যোয়ারির চূড়ান্ত অংশটি হওয়া উচিত WHERE column_2 LIKE '%%%s%%'
জান ফ্যাব্রি

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/...
স্টিফেন হ্যারিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.