sql >> Database teknologi >  >> RDS >> Mysql

PDO udarbejdede erklæringer IN-klausul med navngivne pladsholdere virker ikke som forventet

Dette burde fungere for dig:

Så som allerede nævnt i kommentarerne skal du bruge en pladsholder for hver værdi, som du vil binde ind i IN-sætningen.

Her opretter jeg først arrayet $ids som kun holder de almindelige id'er, f.eks.

[2, 3]

Så oprettede jeg også arrayet $preparedIds som holder pladsholderne som array, som du så senere bruger i den forberedte sætning. Dette array ser nogenlunde sådan ud:

[":id2", ":id3"]

Og jeg opretter også et array kaldet $preparedValues som indeholder $preparedIds som nøgler og $ids som værdier, som du så senere kan bruge til execute() opkald. Arrayet ser nogenlunde sådan ud:

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

Efter dette er du god til at gå. I den forberedte sætning implode() $preparedIds array, så SQL-sætningen ser sådan ud:

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

Og så kan du simpelthen execute() din forespørgsel. Der er jeg bare array_merge() dine $preparedValues array med de andre pladsholdere array.

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

?>

Jeg tror også, du vil sætte en if-sætning omkring din forespørgsel, da din forespørgsel ikke vil køre, hvis værdierne for $timestart og $timeend er NULL.




  1. Postgres-fejl efter opdatering af TimescaleDB på Ubuntu:fil blev ikke fundet

  2. Max JSON kolonnelængde i MySQL

  3. MySql scoping problem med korrelerede underforespørgsler

  4. Sådan hentes feltnavne fra midlertidig tabel (SQL Server 2008)