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
DDDasal
2024-12-28 01:37:09389semak imbas

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();

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!

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