Rumah >pembangunan bahagian belakang >tutorial php >Mengapa Klausa IN PDO Tidak Berfungsi dengan Parameter Tatasusunan, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Klausa IN PDO Tidak Berfungsi dengan Parameter Tatasusunan, dan Bagaimana Saya Boleh Membetulkannya?

DDD
DDDasal
2024-12-26 14:17:09791semak imbas

Why Doesn't PDO's IN Clause Work with Array Parameters, and How Can I Fix It?

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!

Kenyataan:
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