sql >> Database >  >> RDS >> Mysql

PDO voorbereide verklaringen IN-clausule met benoemde tijdelijke aanduidingen werkt niet zoals verwacht

Dit zou voor jou moeten werken:

Dus zoals al gezegd in de opmerkingen, heb je een tijdelijke aanduiding nodig voor elke waarde die je in de IN-clausule wilt binden.

Hier maak ik eerst de array $ids die alleen de gewone id's bevat, bijvoorbeeld

[2, 3]

Toen maakte ik ook de array $preparedIds die de tijdelijke aanduidingen als array bevat, die u later in de voorbereide instructie gebruikt. Deze array ziet er ongeveer zo uit:

[":id2", ":id3"]

En ik maak ook een array met de naam $preparedValues die de $preparedIds . bevat als sleutels en $ids als waarden, die u later kunt gebruiken voor de execute() telefoongesprek. De array ziet er ongeveer zo uit:

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

Hierna ben je klaar om te gaan. In de voorbereide verklaring implode() de $preparedIds array, zodat de SQL-instructie er ongeveer zo uitziet:

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

En dan kun je gewoon execute() uw vraag. Daar heb ik gewoon array_merge() uw $preparedValues array met de andere placeholders 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;
    }

?>

Ik denk ook dat je een if-statement rond je query wilt plaatsen, omdat je query niet wordt uitgevoerd als de waarden van $timestart en $timeend zijn NULL.




  1. MySQL Update Kolom van andere kolom in dezelfde tabel

  2. Hoe bereikt deze CASE-expressie de ELSE-clausule?

  3. Recordtellingen voor alle tabellen in de MySQL-database ophalen

  4. Hoe JSON-object op te slaan in PostgreSQL met behulp van JSONB-gegevenstype in tabel en PostgreSQL JDBC-stuurprogramma