Rumah > pembangunan bahagian belakang > tutorial php > Cara Menggunakan Klausa IN PDO dengan Tatasusunan dengan betul: Kedudukan lwn. Pemegang Tempat Dinamakan?

Cara Menggunakan Klausa IN PDO dengan Tatasusunan dengan betul: Kedudukan lwn. Pemegang Tempat Dinamakan?

DDD
Lepaskan: 2024-12-28 01:37:09
asal
398 orang telah melayarinya

How to Correctly Use PDO's IN Clause with Arrays: Positional vs. Named Placeholders?

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

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

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

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan