PDO cemerlang dalam melaksanakan kenyataan dengan klausa IN apabila menggunakan tatasusunan untuk nilainya, seperti yang digambarkan dalam kod berikut:
$in_array = [1, 2, 3]; $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (?)"); $my_result->execute([$in_values]); $my_results = $my_result->fetchAll();
Walau bagaimanapun, kod berikut menunjukkan yang tidak dijangka tingkah laku:
$in_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([':in_values' => $in_values]); $my_results = $my_result->fetchAll();
Daripada memulangkan semua item yang my_valuenya sepadan dengan nilai dalam $in_array, kod ini hanya mengembalikan item yang my_valuenya sepadan dengan item pertama dalam $in_array.
PDO tidak dilengkapi untuk mengendalikan senario sedemikian dengan berkesan. Untuk menggunakan tatasusunan dalam klausa IN, kita mesti menjana rentetan secara dinamik dengan ruang letak dan memasukkannya ke dalam pertanyaan. Dengan pemegang tempat kedudukan, penyelesaiannya adalah seperti berikut:
$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();
Untuk kes dengan berbilang ruang letak, pertimbangkan untuk memanfaatkan array_merge(). Contohnya:
$arr = [1, 2, 3]; $in = str_repeat('?,', count($arr) - 1) . '?'; $sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?"; $stm = $db->prepare($sql); $params = array_merge([$foo], $arr, [$bar, $baz]); $stm->execute($params); $data = $stm->fetchAll();
Dalam senario dengan ruang letak yang dinamakan, prosesnya lebih rumit, kerana ia melibatkan penjanaan jujukan ruang letak, contohnya, :id0, :id1, :id2.
$ids = [1, 2, 3]; $in = ""; $i = 0; foreach ($ids as $item) { $key = ":id" . $i++; $in .= ($in ? "," : "") . $key; $in_params[$key] = $item; } $sql = "SELECT * FROM table WHERE id IN ($in)"; $stm = $db->prepare($sql); $stm->execute(array_merge($params, $in_params)); $data = $stm->fetchAll();
Nasib baik, pemegang tempat yang dinamakan tidak memerlukan susunan yang ketat, membenarkan penggabungan tatasusunan dalam mana-mana turutan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Klausa IN PDO dengan Array dalam PHP dengan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!