Rumah >pembangunan bahagian belakang >tutorial php >Cara Menggunakan Klausa IN PDO dengan Tatasusunan dengan betul: Kedudukan lwn. Pemegang Tempat Dinamakan?
Menggunakan PDO dengan Tatasusunan Klausa IN
Apabila menggunakan PDO untuk operasi pangkalan data, menggunakan tatasusunan dalam klausa IN biasanya ditemui. Walau bagaimanapun, perbezaan timbul dalam pendekatan untuk pemegang tempat kedudukan berbanding pemegang tempat yang dinamakan.
Pemegang tempat Kedudukan
Untuk pemegang tempat kedudukan, coretan kod berikut menunjukkan pendekatan yang betul:
$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(); $my_results = $my_result->fetchAll();
Walau bagaimanapun, kod berikut menggunakan ruang letak bernama menghasilkan yang tidak dijangka keputusan:
$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();
Kod ini hanya akan mengembalikan item dengan my_value sama dengan elemen pertama dalam $in_array (1).
Penyelesaian
PDO mengendalikan senario ini secara berbeza. Untuk menyelesaikan isu ini, cipta rentetan secara dinamik dengan ruang letak dan masukkannya ke dalam pertanyaan sambil mengikat nilai tatasusunan seperti biasa. Untuk ruang letak kedudukan:
$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 ruang letak yang dinamakan, pendekatan yang lebih kompleks diperlukan kerana anda perlu mencipta jujukan ruang letak yang dinamakan, mis. :id0,:id1,:id2.
// other parameters that are going into query $params = ["foo" => "foo", "bar" => "bar"]; $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 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();
Pendekatan ini membenarkan penggabungan tatasusunan dalam sebarang susunan, tidak seperti pemegang tempat kedudukan.
Atas ialah kandungan terperinci Cara Menggunakan Klausa IN PDO dengan Tatasusunan dengan betul: Kedudukan lwn. Pemegang Tempat Dinamakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!