Проблемът е тук:
$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
Предполагам, че $regGUID е разделен със запетая списък с низове в кавички.
Всеки параметър на заявката приема само една скаларна стойност. Не списъци на ценности.
Така че имате два избора:
-
Продължете да интерполирате низа $regGUID, дори ако използвате параметри за други скаларни стойности. Но все пак искате да внимавате да избегнете SQL инжектиране, така че трябва да формирате правилно низа $regGUID. Не можете просто да извикате PDO::quote() на целия низ, това би го направило низ с единични кавички, съдържащ UUID и запетаи. Трябва да се уверите, че всеки UUID низ е екраниран и цитиран поотделно, след това да имплодирате списъка заедно и да го интерполирате в клаузата 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 в масив и добавете един параметър на заявка за всеки елемент в масива. Интерполирайте динамичния списък с заместители на параметри на заявката.$regGUIDs = explode(',', $regGUID); $params = array_fill(1, count($regGUIDs), '?'); $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
Можете да bindValue() в цикъл за масива, но имайте предвид, че другите параметри също трябва да бъдат обвързани с позиция, а не с име. PDO има грешки, които не го правят щастлив, когато се опитате да смесите двата различни стила на параметри в една и съща заявка.
Вместо да използвам bindValue() просто предавам масив от стойности на параметри към PDOStatement::execute(), което е много по-лесно.
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);