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!