Problém je zde:
$sql = $sql . 'WHERE a.regGUID in ( :regGUID ) and ';
$stmt->bindValue(':regGUID', $regGUID, PDO::PARAM_STR);
Předpokládám, že $regGUID je seznam řetězců v uvozovkách oddělených čárkami.
Každý parametr dotazu přijímá pouze jednu skalární hodnotu. Ne seznamy hodnot.
Takže máte dvě možnosti:
-
Pokračujte v interpolaci řetězce $regGUID, i když používáte parametry pro jiné skalární hodnoty. Stále však chcete být opatrní, abyste se vyhnuli vkládání SQL, takže musíte správně vytvořit řetězec $regGUID. Nemůžete jen volat PDO::quote() na celý řetězec, to by z něj udělalo jediný řetězec v uvozovkách obsahující UUID a čárky. Musíte se ujistit, že každý řetězec UUID je escapován a uvozován jednotlivě, poté seznam spojte dohromady a vložíte jej do klauzule 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 pole a přidejte jeden parametr dotazu pro každý prvek v poli. Interpolujte dynamický seznam zástupných symbolů parametrů dotazu.$regGUIDs = explode(',', $regGUID); $params = array_fill(1, count($regGUIDs), '?'); $sql = $sql . ' WHERE a.regGUID in ( ' . implode(',', $params) . ' ) and ';
Můžete bindValue() ve smyčce pro pole, ale mějte na paměti, že ostatní parametry by také měly být vázány pozicí, nikoli názvem. PDO má chyby, kvůli kterým není šťastný, když se pokoušíte smíchat dva různé styly parametrů ve stejném dotazu.
Místo použití bindValue() pouze předám pole hodnot parametrů do PDOStatement::execute(), což je mnohem jednodušší.
$paramValues = $regGUIDs;
$paramValues[] = $game;
$results = $stmt->execute($paramValues);