Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pernyataan yang disiapkan PDO klausa IN dengan placeholder bernama tidak berfungsi seperti yang diharapkan

Ini akan bekerja untuk Anda:

Jadi seperti yang sudah dikatakan di komentar, Anda memerlukan placeholder untuk setiap nilai yang ingin Anda ikat ke dalam klausa IN.

Disini saya buat dulu array $ids yang hanya menyimpan id biasa, mis.

[2, 3]

Kemudian saya juga membuat array $preparedIds yang menyimpan placeholder sebagai array, yang kemudian Anda gunakan dalam pernyataan yang disiapkan. Array ini terlihat seperti ini:

[":id2", ":id3"]

Dan saya juga membuat array bernama $preparedValues yang menyimpan $preparedIds sebagai kunci dan $ids sebagai nilai, yang nantinya dapat Anda gunakan untuk execute() panggilan. Array terlihat seperti ini:

[":id2" => 2, ":id3" => 3]

Setelah ini Anda baik untuk pergi. Dalam pernyataan yang disiapkan, saya hanya implode() $preparedIds array, sehingga pernyataan SQL terlihat seperti ini:

... IN(:id2,:id3) ...

Dan kemudian Anda cukup execute() permintaan Anda. Di sana saya hanya array_merge() $preparedValues Anda array dengan array placeholder lainnya.

<?php

    $ids = array_map(function($item){
        return $item->id;
    }, $entitlementsVOs);

    $preparedIds = array_map(function($v){
        return ":id$v";
    }, $ids);

    $preparedValues = array_combine($preparedIds, $ids);


    $timestart = (!empty($_GET['start']) ? $_GET['start'] : NULL );
    $timeend = (!empty($_GET['end']) ? $_GET['end'] : NULL );


    $statement = $this->connection->prepare("SELECT name AS title, timestart AS start, timestart + timeduration AS end FROM event WHERE courseid IN(" . implode(",", $preparedIds) . ") AND timestart >= :timestart AND timestart + timeduration <= :timeend");
    $statement->setFetchMode(\PDO::FETCH_CLASS, get_class(new EventVO()));

    if($statement->execute(array_merge($preparedValues, ["timestart" => $timestart, "timeend" => $timeend]))) {
        return $statement->fetchAll();
    } else {
        return null;
    }

?>

Saya juga pikir Anda ingin meletakkan pernyataan if di sekitar kueri Anda, karena kueri Anda tidak akan berjalan jika nilai $timestart dan $timeend adalah NULL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memfilter dari tabel gabungan

  2. MySQL pilih di mana kolom tidak kosong

  3. menyalin ke tabel temp membutuhkan waktu lama

  4. MySQL memberikan kesalahan Entri duplikat ketika mencoba menambah bidang tanggal?

  5. Memahami Self Join