Du behöver egentligen inte testa att ingången är numerisk, för i MySQL kan vilken sträng som helst t.ex. '123abc'
i ett numeriskt sammanhang (som att jämföras med en heltalskolumn id
) tar implicit bara siffrorna och ignorerar resten. En icke-numerisk sträng som 'abc'
har helt enkelt heltalsvärdet 0 eftersom det inte finns några inledande siffror.
Poängen är att värden är säkra från SQL-injektion om du använder frågeparametrar. Om indata kommer från $_SESSION eller en annan källa är irrelevant. $_SESSION är varken säker eller osäker med avseende på SQL-injektion, det är hur du skickar data till din fråga som spelar roll.
Jag skulle också förenkla koden för att formatera listan över parameterplatshållare:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
Och glöm bindParam(), skicka bara arrayen till execute()
.
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
Angående din kommentar:
I PDO kan du använda båda namngivna parametrar som :id
, eller så kan du använda positionsparametrar, som alltid är ?
(men blanda inte dessa två typer i en given fråga, använd den ena eller den andra).
Skickar en array till execute()
binder automatiskt arrayelementen till parametrarna. En enkel array (dvs indexerad med heltal) är lätt att binda till positionsparametrar.
Om du använder namngivna parametrar måste du skicka en associativ array där arrayens nycklar matchar parameternamnen. Arraynycklarna kan valfritt ha prefixet :
men det är inte nödvändigt.
Om du är ny på PDO, lönar det sig verkligen att läsa dokumentationen . Det finns kodexempel och allt!