Realmente no tiene que probar que la entrada sea numérica, porque en MySQL, cualquier cadena, p. '123abc'
en un contexto numérico (como ser comparado con una columna de enteros id
) toma implícitamente solo los dígitos e ignora el resto. Una cadena no numérica como 'abc'
simplemente tiene el valor entero 0 porque no hay dígitos iniciales.
El punto es que los valores están a salvo de la inyección SQL si usa parámetros de consulta. Si las entradas provienen de $_SESSION o de otra fuente, es irrelevante. $_SESSION no es ni seguro ni inseguro con respecto a la inyección SQL, lo que importa es cómo pasas los datos a tu consulta.
También simplificaría el código para dar formato a la lista de marcadores de posición de parámetros:
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
Y olvídate de bindParam(), solo pasa la matriz 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 tu comentario:
En PDO, puede usar parámetros con nombre como :id
, o puede usar parámetros posicionales, que siempre son ?
(pero no mezcle estos dos tipos en una misma consulta, use uno u otro).
Pasar una matriz a execute()
vincula automáticamente los elementos de la matriz a los parámetros. Una matriz simple (es decir, indexada por números enteros) es fácil de vincular a parámetros posicionales.
Si usa parámetros con nombre, debe pasar una matriz asociativa donde las claves de la matriz coincidan con los nombres de los parámetros. Las claves de matriz pueden opcionalmente tener el prefijo :
pero no es obligatorio.
Si eres nuevo en PDO, realmente vale la pena leer la documentación . ¡Hay ejemplos de código y todo!