Masalahnya ada di sini:
$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
Saya berasumsi $regGUID adalah daftar string kutipan yang dipisahkan koma.
Setiap parameter kueri hanya menerima satu nilai skalar. Bukan daftar nilai.
Jadi Anda memiliki dua pilihan:
-
Lanjutkan interpolasi string $regGUID, bahkan jika Anda menggunakan parameter untuk nilai skalar lainnya. Tetapi Anda tetap ingin berhati-hati untuk menghindari injeksi SQL, jadi Anda harus membentuk string $regGUID dengan benar. Anda tidak bisa hanya memanggil PDO::quote() di seluruh string, itu akan menjadikannya satu string yang dikutip yang berisi UUID dan koma. Anda harus memastikan setiap string UUID diloloskan dan dikutip satu per satu, lalu memasukkan daftar tersebut bersama-sama dan menyisipkannya ke dalam klausa IN.
$regGUIDs = explode(',', $regGUID); $regGUIDs = array_map(function ($g) { return $db->quote($g); }, $regGUIDs); $regGUID = implode(',', $regGUIDs); $sql = $sql . 'WHERE a.regGUID in (' . $regGUID . ') and ';
-
explode()
$regGUID ke dalam larik, dan tambahkan satu parameter kueri untuk setiap elemen dalam larik. Interpolasi daftar dinamis placeholder parameter kueri.$regGUIDs = explode(',', $regGUID); $params = array_fill(1, count($regGUIDs), '?'); $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
Anda bisa bindValue() dalam satu lingkaran untuk array, tetapi perlu diingat bahwa parameter lain juga harus terikat oleh posisi, bukan dengan nama. PDO memiliki bug yang membuatnya tidak senang saat Anda mencoba mencampur dua gaya parameter yang berbeda dalam kueri yang sama.
Alih-alih menggunakan bindValue() saya hanya meneruskan array nilai parameter ke PDOStatement::execute(), yang jauh lebih mudah.
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);