Problemet er her:
$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
Jeg antager, at $regGUID er en kommasepareret liste over citerede strenge.
Hver forespørgselsparameter accepterer kun en enkelt skalarværdi. Ikke lister af værdier.
Så du har to valg:
-
Fortsæt med at interpolere $regGUID-strengen, selvom du bruger parametre til andre skalarværdier. Men du vil stadig være forsigtig med at undgå SQL-injektion, så du skal danne $regGUID-strengen korrekt. Du kan ikke bare kalde PDO::quote() på hele strengen, det ville gøre den til en enkelt citeret streng indeholdende UUID'er og kommaer. Du skal sikre dig, at hver UUID-streng er escaped og citeret individuelt, derefter implodere listen sammen og interpolere den i IN-sætningen.
$regGUIDs = explode(',', $regGUID); $regGUIDs = array_map(function ($g) { return $db->quote($g); }, $regGUIDs); $regGUID = implode(',', $regGUIDs); $sql = $sql . 'WHERE a.regGUID in (' . $regGUID . ') and ';
-
explode()
$regGUID ind i et array, og tilføj én forespørgselsparameter for hvert element i arrayet. Interpoler den dynamiske liste over forespørgselsparameterpladsholdere.$regGUIDs = explode(',', $regGUID); $params = array_fill(1, count($regGUIDs), '?'); $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
Du kunne bindValue() i en loop for arrayet, men husk at andre parametre også skal være bundet af position, ikke af navn. PDO har fejl, der gør det ikke glad, når du prøver at blande de to forskellige stilarter af parametre i den samme forespørgsel.
I stedet for at bruge bindValue() sender jeg bare en række parameterværdier til PDOStatement::execute(), hvilket er meget nemmere.
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);