Mysql
 sql >> база данни >  >> RDS >> Mysql

Клауза IN, подготвени за PDO изявления с именувани контейнери, не работи според очакванията

Това трябва да работи за вас:

Така че, както вече беше казано в коментарите, имате нужда от контейнер за всяка стойност, която искате да свържете в клаузата IN.

Тук първо създавам масива $ids който съдържа само обикновените идентификатори, напр.

[2, 3]

След това създадох и масива $preparedIds който съдържа контейнерите като масив, който след това използвате по-късно в подготвения израз. Този масив изглежда по следния начин:

[":id2", ":id3"]

Освен това създавам масив, наречен $preparedValues който съдържа $preparedIds като ключове и $ids като стойности, които по-късно можете да използвате за execute() повикване. Масивът изглежда по следния начин:

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

След това сте готови. В подготвения оператор аз просто implode() $preparedIds масив, така че SQL операторът да изглежда по следния начин:

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

И тогава можете просто да execute() вашето запитване. Там просто array_merge() вашите $preparedValues масив с другия масив от заместители.

<?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;
    }

?>

Също така мисля, че искате да поставите оператор if около вашата заявка, тъй като вашата заявка няма да се изпълни, ако стойностите на $timestart и $timeend са 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. MySQL:Как да вмъкна запис за всеки резултат в SQL заявка?

  2. Предимства на MySQLi пред MySQL

  3. Как да разбера кога моят docker mysql контейнер е готов и mysql е готов за приемане на заявки?

  4. Няма отговор от PHP на AJAX заявка

  5. Как да надстроите MySQL на CentOS