Rumah > pembangunan bahagian belakang > tutorial php > Bagaimana untuk Mengikat Nilai Tatasusunan dengan Benar ke Penyata MySQL IN Menggunakan PDO?

Bagaimana untuk Mengikat Nilai Tatasusunan dengan Benar ke Penyata MySQL IN Menggunakan PDO?

Susan Sarandon
Lepaskan: 2024-12-04 22:27:11
asal
248 orang telah melayarinya

How to Properly Bind Array Values to a MySQL IN Statement Using PDO?

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)
Salin selepas log masuk

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')
Salin selepas log masuk

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);
Salin selepas log masuk

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();
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan