Menggunakan PDO dengan Tatasusunan Klausa IN
Apabila menggunakan PDO untuk melaksanakan pernyataan dengan klausa IN yang menggunakan tatasusunan untuk nilainya, anda mungkin menghadapi tingkah laku yang tidak dijangka. Artikel ini menerangkan sebab pendekatan khusus tidak berfungsi dan menyediakan penyelesaian alternatif.
Contoh:
$in_array = array(1, 2, 3); $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN ($in_values)"); $my_result->execute(); $my_results = $my_result->fetchAll();
Kod ini berfungsi seperti yang diharapkan. Walau bagaimanapun, jika anda cuba menggunakan parameter bernama dengan klausa IN, kod berikut tidak akan:
$in_array = array(1, 2, 3); $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)"); $my_result->execute(array(':in_values' => $in_values)); $my_results = $my_result->fetchAll();
Penjelasan:
PDO menghadapi kesukaran mengendalikan klausa IN dengan tatasusunan. Sebaliknya, anda perlu mencipta rentetan dengan ruang letak dan memasukkannya ke dalam pertanyaan, mengikat nilai tatasusunan dengan cara biasa.
Alternatif:
Menggunakan Kedudukan Pemegang tempat
Buat rentetan dengan ruang letak secara dinamik dan masukkannya ke dalam pertanyaan:
$in = str_repeat('?,', count($in_array) - 1) . '?'; $sql = "SELECT * FROM my_table WHERE my_value IN ($in)"; $stm = $db->prepare($sql); $stm->execute($in_array); $data = $stm->fetchAll();
Menggunakan Pemegang Tempat Dinamakan
Anda boleh menggunakan fungsi array_merge() untuk menggabungkan semua pembolehubah ke dalam tatasusunan tunggal, termasuk pemegang tempat bernama:
// Other parameters that are going into query $params = ["foo" => "foo", "bar" => "bar"]; $ids = [1, 2, 3]; $in = ""; $i = 0; // Using an external counter because actual array keys could be dangerous foreach ($ids as $item) { $key = ":id" . $i++; $in .= ($in ? "," : "") . $key; // :id0,:id1,:id2 $in_params[$key] = $item; // Collecting values into a key-value array } $sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar"; $stm = $db->prepare($sql); $stm->execute(array_merge($params, $in_params)); // Just merge two arrays $data = $stm->fetchAll();
Atas ialah kandungan terperinci Mengapa Klausa IN PDO Tidak Berfungsi dengan Parameter Tatasusunan, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!