Du behøver ikke rigtig at teste for inputtet er numerisk, for i MySQL kan enhver streng f.eks. '123abc'
i en numerisk kontekst (som at blive sammenlignet med en heltalskolonne id
) tager implicit kun cifrene og ignorerer resten. En ikke-numerisk streng som 'abc'
har simpelthen heltalsværdien 0, fordi der ikke er nogen førende cifre.
Pointen er, at værdier er sikre fra SQL-injektion, hvis du bruger forespørgselsparametre. Hvorvidt input kommer fra $_SESSION eller en anden kilde er irrelevant. $_SESSION er hverken sikker eller usikker med hensyn til SQL-injektion, det er, hvordan du videregiver dataene til din forespørgsel, der betyder noget.
Jeg ville også forenkle koden for at formatere listen over parameterpladsholdere:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
Og glem alt om bindParam(), send bare arrayet til execute()
.
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
Om din kommentar:
I PDO kan du bruge enten navngivne parametre som :id
, eller du kan bruge positionelle parametre, som altid er ?
(men bland ikke disse to typer i en given forespørgsel, brug den ene eller den anden).
Sender et array til execute()
binder automatisk array-elementerne til parametrene. En simpel matrix (dvs. indekseret med heltal) er let at binde til positionelle parametre.
Hvis du bruger navngivne parametre, skal du sende et associativt array, hvor nøglerne til arrayet matcher parameternavnene. Array-tasterne kan valgfrit være foranstillet med :
men det er ikke påkrævet.
Hvis du er ny til PDO, kan det virkelig betale sig at læse dokumentationen . Der er kodeeksempler og det hele!