Nilai Pengikat PDO untuk Penyata MySQL IN
Anda menghadapi masalah apabila menggunakan PDO untuk mengikat tatasusunan nilai ke MySQL IN kenyataan. Matlamat anda adalah untuk melaksanakan pertanyaan seperti berikut:
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (1,2,3,4,5,6,7,8)
Walau bagaimanapun, PDO sedang menukar nilai terikat kepada rentetan yang dipisahkan koma, menghasilkan pertanyaan yang salah berikut:
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN ('1,2,3,4,5,6,7,8')
Anda telah mencuba menggunakan fungsi tersuai untuk memisahkan rentetan yang dipisahkan koma di dalam pertanyaan itu sendiri, tetapi ini bukan langkah optimum penyelesaian.
Penyelesaian 1: Membina Pertanyaan Secara Manual
Seperti yang dicadangkan dalam soalan sebelumnya, anda boleh membina pertanyaan secara manual dengan menggabungkan pemegang tempat untuk setiap nilai klausa IN. Contohnya:
$products = array(1,2,3,4,5,6,7,8); $placeholders = array_fill(0, count($products), '?'); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (" . implode(',', $placeholders) . ")"; $stmt = $pdo->prepare($sql); $stmt->execute($products);
Penyelesaian 2: Menggunakan find_in_set()
Anda boleh menggunakan fungsi find_in_set() untuk memadankan nilai dengan rentetan yang dipisahkan koma. Walau bagaimanapun, pendekatan ini mungkin mempunyai masalah prestasi dengan set data yang besar, kerana ia memerlukan penukaran setiap nilai dalam jadual kepada jenis aksara.
$products = array(1,2,3,4,5,6,7,8); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE find_in_set(cast(products.id as char), '" . implode(',', $products) . "') > 0"; $stmt = $pdo->prepare($sql); $stmt->execute();
Penyelesaian 3: Mencipta Fungsi Ditentukan Pengguna
Penyelesaian terbaik ialah mencipta fungsi takrif pengguna (UDF) yang memisahkan rentetan dipisahkan koma. Ini adalah penyelesaian yang agak kompleks, tetapi ia memberikan prestasi terbaik untuk klausa IN dengan senarai bersaiz berubah-ubah.
Rujuk pautan yang disediakan untuk mendapatkan arahan tentang mencipta UDF.
Atas ialah kandungan terperinci Bagaimana untuk Mengikat Nilai Tatasusunan dengan Benar ke Penyata MySQL IN Menggunakan PDO?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!