Opravdu nemusíte testovat, zda je vstup číselný, protože v MySQL je jakýkoli řetězec, např. '123abc'
v číselném kontextu (jako při srovnání s celočíselným sloupcem id
) implicitně bere pouze číslice a zbytek ignoruje. Nečíselný řetězec jako 'abc'
má jednoduše celočíselnou hodnotu 0, protože zde nejsou žádné úvodní číslice.
Jde o to, že hodnoty jsou v bezpečí před SQL injection, pokud používáte parametry dotazu. Zda vstupy pocházejí z $_SESSION nebo jiného zdroje, je irelevantní. $_SESSION není ani bezpečný, ani nebezpečný s ohledem na SQL injection, záleží na tom, jak předáte data vašemu dotazu.
Také bych zjednodušil kód pro formátování seznamu zástupných symbolů parametrů:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
A zapomeňte na bindParam(), prostě předejte pole do execute()
.
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
K vašemu komentáři:
V PDO můžete použít buď pojmenované parametry jako :id
, nebo můžete použít poziční parametry, které jsou vždy ?
(ale nesměšujte tyto dva typy v daném dotazu, použijte jeden nebo druhý).
Předání pole do execute()
automaticky sváže prvky pole s parametry. Jednoduché pole (tj. indexované celými čísly) lze snadno svázat s pozičními parametry.
Pokud používáte pojmenované parametry, musíte předat asociativní pole, kde se klíče pole shodují s názvy parametrů. Klíče pole mohou být volitelně opatřeny předponou :
ale není to povinné.
Pokud s PDO začínáte, opravdu se vyplatí přečíst si dokumentaci . Existují příklady kódu a všechno!