Tak naprawdę nie musisz sprawdzać, czy dane wejściowe są numeryczne, ponieważ w MySQL dowolny ciąg, np. '123abc' w kontekście numerycznym (jak porównywanie z kolumną liczb całkowitych id ) niejawnie przyjmuje tylko cyfry i ignoruje resztę. Ciąg nienumeryczny, taki jak 'abc' po prostu ma wartość całkowitą 0, ponieważ nie ma wiodących cyfr.
Chodzi o to, że wartości są bezpieczne przed wstrzyknięciem SQL, jeśli używasz parametrów zapytania. Nie ma znaczenia, czy dane wejściowe pochodzą z $_SESSION, czy z innego źródła. $_SESSION nie jest ani bezpieczna, ani niebezpieczna w odniesieniu do wstrzykiwania SQL, ważne jest, jak przekazujesz dane do zapytania.
Uprościłbym również kod, aby sformatować listę symboli zastępczych parametrów:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
I zapomnij o bindParam(), po prostu przekaż tablicę do execute() .
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
Odpowiedz na swój komentarz:
W PDO możesz użyć nazwanych parametrów, takich jak :id , lub możesz użyć parametrów pozycyjnych, które zawsze są ? (ale nie mieszaj tych dwóch typów w danym zapytaniu, użyj jednego lub drugiego).
Przekazywanie tablicy do execute() automatycznie wiąże elementy tablicy z parametrami. Prosta tablica (tj. indeksowana liczbami całkowitymi) jest łatwa do powiązania z parametrami pozycyjnymi.
Jeśli używasz nazwanych parametrów, musisz przekazać tablicę asocjacyjną, w której klucze tablicy są zgodne z nazwami parametrów. Klucze tablicy mogą opcjonalnie być poprzedzone : ale nie jest to wymagane.
Jeśli jesteś nowy w PDO, naprawdę opłaca się przeczytać dokumentację . Są przykłady kodu i wszystko!