Debemos ocuparnos de las vulnerabilidades de inyección SQL y una condición vacía . Voy a manejar ambos como a continuación.
Para una matriz numérica pura, utilice el viz conversión tipo apropiado intval
o floatval
o doubleval
más de cada elemento. Para tipos de cadena mysqli_real_escape_string()
que también pueden aplicarse a valores numéricos si lo desea. MySQL permite números y variantes de fecha como cadena .
Para escapar adecuadamente de los valores antes de pasar a la consulta, cree una función similar a:
function escape($string)
{
// Assuming $db is a link identifier returned by mysqli_connect() or mysqli_init()
return mysqli_real_escape_string($db, $string);
}
Es probable que dicha función ya esté disponible en su aplicación, o tal vez ya haya creado una.
Desinfecte el conjunto de cadenas como:
$values = array_map('escape', $gallaries);
Una matriz numérica puede ser desinfectados utilizando intval
o floatval
o doubleval
en lugar como adecuados:
$values = array_map('intval', $gallaries);
Luego, finalmente construya la condición de consulta
$where = count($values) ? "`id` = '" . implode("' OR `id` = '", $values) . "'" : 0;
o
$where = count($values) ? "`id` IN ('" . implode("', '", $values) . "')" : 0;
Dado que la matriz también puede estar vacía a veces, como $galleries = array();
deberíamos tener en cuenta que IN ()
no permite una lista vacía. También se puede usar OR
, pero el problema persiste. Por lo tanto, la comprobación anterior count($values)
es para garantizar lo mismo.
Y agréguelo a la consulta final:
$query = 'SELECT * FROM `galleries` WHERE ' . $where;
SUGERENCIA : si desea mostrar todos los registros (sin filtro) en caso de una matriz vacía en lugar de ocultar todas las filas, simplemente reemplace 0 con 1 en la parte falsa del ternario.