O problema está aqui:
$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
Suponho que $regGUID seja uma lista separada por vírgulas de strings entre aspas.
Cada parâmetro de consulta aceita apenas um único valor escalar. Não listas de valores.
Então você tem duas opções:
-
Continue a interpolar a string $regGUID, mesmo se você usar parâmetros para outros valores escalares. Mas você ainda quer ter cuidado para evitar injeção de SQL, então você deve formar a string $regGUID corretamente. Você não pode simplesmente chamar PDO::quote() em toda a string, isso a tornaria uma única string entre aspas contendo UUIDs e vírgulas. Você precisa garantir que cada string UUID seja escapada e citada individualmente e, em seguida, imploda a lista e interpole-a na cláusula IN.
$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()
o $regGUID em uma matriz e adicione um parâmetro de consulta para cada elemento na matriz. Interpolar a lista dinâmica de marcadores de posição do parâmetro de consulta.
$regGUIDs = explode(',', $regGUID); $params = array_fill(1, count($regGUIDs), '?'); $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
Você pode vincularValue() em um loop para o array, mas lembre-se de que outros parâmetros também devem ser vinculados por posição, não por nome. O PDO tem bugs que o tornam insatisfeito quando você tenta misturar os dois estilos diferentes de parâmetros na mesma consulta.
Em vez de usar bindValue(), apenas passo um array de valores de parâmetro para PDOStatement::execute(), o que é muito mais fácil.
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);