sql >> Databasteknik >  >> RDS >> Mysql

PDO-förberedda uttalanden IN-klausul med namngivna platshållare fungerar inte som förväntat

Detta borde fungera för dig:

Så som redan sagts i kommentarerna behöver du en platshållare för varje värde som du vill binda till IN-satsen.

Här skapar jag först arrayen $ids som bara innehåller de vanliga id:en, t.ex.

[2, 3]

Sedan skapade jag också arrayen $preparedIds som håller platshållarna som array, som du sedan använder i den förberedda satsen. Den här arrayen ser ut ungefär så här:

[":id2", ":id3"]

Och jag skapar också en array som heter $preparedValues som innehåller $preparedIds som nycklar och $ids som värden, som du sedan kan använda för execute() ringa upp. Arrayen ser ut ungefär så här:

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

Efter detta är du bra att gå. I det förberedda uttalandet implode() $preparedIds array, så att SQL-satsen ser ut ungefär så här:

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

Och sedan kan du helt enkelt execute() din fråga. Där har jag bara array_merge() dina $preparedValues array med den andra platshållarmatrisen.

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

?>

Jag tror också att du vill lägga en if-sats runt din fråga, eftersom din fråga inte kommer att köras om värdena för $timestart och $timeend är NULL.




  1. Fixa "ERROR 1222 (21000):De använda SELECT-satserna har ett annat antal kolumner" när du använder UNION i MariaDB

  2. Initiera MariaDB 10.4.12 på CentOS 7.7

  3. Kontrollera om Tomcat och MySQL redan är installerade på maskinen

  4. välj prestandaförsämring när du använder DISTINCT med parametrar