Всъщност не е нужно да тествате дали входът е числов, защото в MySQL всеки низ, напр. '123abc'
в числов контекст (като сравняване с целочислена колона id
) имплицитно приема само цифрите и игнорира останалите. Нецифров низ като 'abc'
просто има целочислена стойност 0, защото няма водещи цифри.
Въпросът е, че стойностите са безопасни от SQL инжекция, ако използвате параметри на заявката. Дали входовете идват от $_SESSION или друг източник е без значение. $_SESSION не е нито безопасен, нито опасен по отношение на SQL инжектирането, важно е как предавате данните към заявката си.
Също така бих опростил кода, за да форматирам списъка с заместители на параметри:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
И забравете за bindParam(), просто предайте масива на execute()
.
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
Относно вашия коментар:
В PDO можете да използвате или наименувани параметри като :id
, или можете да използвате позиционни параметри, които винаги са ?
(но не смесвайте тези два типа в дадена заявка, използвайте единия или другия).
Подаване на масив към execute()
автоматично свързва елементите на масива с параметрите. Прост масив (т.е. индексиран от цели числа) е лесен за свързване с позиционни параметри.
Ако използвате именувани параметри, трябва да предадете асоциативен масив, където ключовете на масива съвпадат с имената на параметрите. По избор ключовете на масива могат да имат префикс с :
но не е задължително.
Ако сте нов в PDO, наистина си струва да прочетете документацията . Има примери за кодове и всичко!