Non è necessario verificare che l'input sia numerico, perché in MySQL qualsiasi stringa, ad es. '123abc'
in un contesto numerico (come essere confrontato con una colonna intera id
) prende implicitamente solo le cifre e ignora il resto. Una stringa non numerica come 'abc'
ha semplicemente il valore intero 0 perché non ci sono cifre iniziali.
Il punto è che i valori sono al sicuro da SQL injection se si utilizzano parametri di query. Se gli input provengono da $_SESSION o da un'altra fonte è irrilevante. $_SESSION non è né sicuro né pericoloso rispetto all'SQL injection, è il modo in cui passi i dati alla tua query che conta.
Semplificherei anche il codice per formattare l'elenco dei segnaposto dei parametri:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
E dimentica bindParam(), passa semplicemente l'array a execute()
.
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
Re il tuo commento:
In PDO, puoi utilizzare entrambi i parametri denominati come :id
oppure puoi utilizzare i parametri posizionali, che sono sempre ?
(ma non mescolare questi due tipi in una determinata query, usa l'uno o l'altro).
Passaggio di un array a execute()
associa automaticamente gli elementi dell'array ai parametri. Un semplice array (cioè indicizzato da numeri interi) è facile da associare a parametri posizionali.
Se si utilizzano parametri denominati, è necessario passare un array associativo in cui le chiavi dell'array corrispondono ai nomi dei parametri. Le chiavi dell'array possono essere opzionalmente precedute da :
ma non è obbligatorio.
Se non conosci il PDO, vale davvero la pena leggere la documentazione . Ci sono esempi di codice e tutto il resto!