sql >> Databasteknik >  >> RDS >> Mysql

PDO PHP bindValue fungerar inte

Problemet är här:

$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);

Jag antar att $regGUID är en kommaseparerad lista med citattecken.

Varje frågeparameter accepterar endast ett enda skalärt värde. Inte listor av värden.

Så du har två val:

  1. Fortsätt att interpolera $regGUID-strängen, även om du använder parametrar för andra skalära värden. Men du vill ändå vara försiktig med att undvika SQL-injektion, så du måste bilda $regGUID-strängen korrekt. Du kan inte bara anropa PDO::quote() på hela strängen, det skulle göra den till en enda citerad sträng som innehåller UUID och kommatecken. Du måste se till att varje UUID-sträng är escaped och citerad individuellt, sedan implodera listan tillsammans och interpolera den i IN-satsen.

    $regGUIDs = explode(',', $regGUID);
    $regGUIDs = array_map(function ($g) { return $db->quote($g); }, $regGUIDs);
    $regGUID = implode(',', $regGUIDs);
    $sql = $sql . 'WHERE a.regGUID in (' . $regGUID . ') and ';
    
  2. explode() $regGUID till en array och lägg till en frågeparameter för varje element i arrayen. Interpolera den dynamiska listan med platshållare för frågeparameter.

    $regGUIDs = explode(',', $regGUID);
    $params = array_fill(1, count($regGUIDs), '?');
    $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
    

Du kan bindValue() i en loop för arrayen, men kom ihåg att andra parametrar också ska vara bundna av position, inte av namn. PDO har buggar som gör det inte nöjd när du försöker blanda de två olika stilarna av parametrar i samma fråga.

Istället för att använda bindValue() skickar jag bara en array av parametervärden till PDOStatement::execute(), vilket är mycket enklare.

$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);


  1. Hur SIN() fungerar i MariaDB

  2. Skapar du en anpassad fråga med Spring DATA JPA?

  3. Handledning för Microsoft TreeView-kontroll

  4. Oracle SQL Developer 21.4.2 och SQLcl 21.4.1 är nu tillgängliga