Dovremmo occuparci delle vulnerabilità dell'iniezione SQL e di una condizione vuota . Ho intenzione di gestire entrambi come di seguito.
Per una matrice numerica pura, utilizzare il tipo appropriato conversione viz intval
o floatval
o doubleval
su ciascun elemento. Per tipi di stringa mysqli_real_escape_string()
che possono essere applicati anche a valori numerici se lo si desidera. MySQL consente numeri e varianti di data come stringa .
Per evitare in modo appropriato i valori prima di passare alla query, creare una funzione simile a:
function escape($string)
{
// Assuming $db is a link identifier returned by mysqli_connect() or mysqli_init()
return mysqli_real_escape_string($db, $string);
}
Una tale funzione sarebbe molto probabilmente già disponibile nella tua applicazione, o forse ne hai già creata una.
Disinfetta l'array di stringhe come:
$values = array_map('escape', $gallaries);
Un array numerico può essere disinfettato usando intval
o floatval
o doubleval
invece come adatto:
$values = array_map('intval', $gallaries);
Quindi crea finalmente la condizione della query
$where = count($values) ? "`id` = '" . implode("' OR `id` = '", $values) . "'" : 0;
o
$where = count($values) ? "`id` IN ('" . implode("', '", $values) . "')" : 0;
Poiché l'array può anche essere vuoto a volte, come $galleries = array();
dovremmo quindi notare che IN ()
non consente un elenco vuoto. Si può anche usare OR
invece, ma il problema rimane. Quindi il controllo di cui sopra count($values)
, è quello di garantire lo stesso.
E aggiungilo alla query finale:
$query = 'SELECT * FROM `galleries` WHERE ' . $where;
SUGGERIMENTO : se si desidera mostrare tutti i record (nessun filtro) in caso di un array vuoto invece di nascondere tutte le righe, sostituire semplicemente 0 con 1 nella parte falsa del ternario.