Problem jest tutaj:
$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
Zakładam, że $regGUID to rozdzielona przecinkami lista ciągów w cudzysłowie.
Każdy parametr zapytania akceptuje tylko jedną wartość skalarną. Nie listy wartości.
Masz więc dwie możliwości:
-
Kontynuuj interpolację ciągu $regGUID, nawet jeśli używasz parametrów dla innych wartości skalarnych. Ale nadal chcesz uważać, aby uniknąć wstrzyknięcia SQL, więc musisz poprawnie utworzyć ciąg $regGUID. Nie możesz po prostu wywołać PDO::quote() na całym łańcuchu, co uczyniłoby go pojedynczym łańcuchem w cudzysłowie zawierającym UUID i przecinki. Musisz upewnić się, że każdy łańcuch UUID jest escapowany i cytowany indywidualnie, a następnie implodować listę razem i interpolować ją do klauzuli 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()
$regGUID do tablicy i dodaj jeden parametr zapytania dla każdego elementu w tablicy. Interpoluj dynamiczną listę symboli zastępczych parametrów zapytania.$regGUIDs = explode(',', $regGUID); $params = array_fill(1, count($regGUIDs), '?'); $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
Możesz bindValue() w pętli dla tablicy, ale pamiętaj, że inne parametry również powinny być powiązane z pozycją, a nie nazwą. PDO ma błędy, które sprawiają, że nie jest szczęśliwy, gdy próbujesz mieszać dwa różne style parametrów w tym samym zapytaniu.
Zamiast używać bindValue() po prostu przekazuję tablicę wartości parametrów do PDOStatement::execute(), co jest znacznie łatwiejsze.
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);