U hoeft niet echt te testen of de invoer numeriek is, omdat in MySQL elke tekenreeks, b.v. '123abc'
in een numerieke context (zoals vergeleken worden met een integer kolom id
) neemt impliciet alleen de cijfers en negeert de rest. Een niet-numerieke tekenreeks zoals 'abc'
heeft gewoon de gehele waarde 0 omdat er geen voorloopcijfers zijn.
Het punt is dat waarden veilig zijn voor SQL-injectie als u queryparameters gebruikt. Of de invoer afkomstig is van $_SESSION of een andere bron is niet relevant. $_SESSION is niet veilig of onveilig met betrekking tot SQL-injectie, het gaat erom hoe u de gegevens doorgeeft aan uw query.
Ik zou de code ook vereenvoudigen om de lijst met tijdelijke aanduidingen voor parameters op te maken:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
En vergeet bindParam(), geef de array gewoon door aan execute()
.
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
Opnieuw uw opmerking:
In PDO kunt u beide benoemde parameters gebruiken, zoals :id
, of u kunt positionele parameters gebruiken, die altijd ?
. zijn (maar meng deze twee typen niet in een bepaalde zoekopdracht, gebruik de een of de ander).
Een array doorgeven aan execute()
bindt automatisch de array-elementen aan de parameters. Een eenvoudige array (d.w.z. geïndexeerd door gehele getallen) is gemakkelijk te binden aan positionele parameters.
Als u benoemde parameters gebruikt, moet u een associatieve array doorgeven waarbij de sleutels van de array overeenkomen met de parameternamen. De array-sleutels kunnen optioneel worden voorafgegaan door :
maar het is niet verplicht.
Als je nieuw bent bij PDO, loont het echt de moeite om de documentatie te lezen . Er zijn codevoorbeelden en zo!