Je fais plusieurs types de vérification dans différentes situations pour faire e Assurez-vous que l'instruction sql est valide. Dans le type le plus fondamental de la vérification, je fais en sorte que la variable ne soit pas vide ou faux
$in = implode(',',$ids);
if(!$ids) $in="0";
$query = "SELECT * FROM user WHERE user_id IN ($ids)";
En général, j'utilise toute une série de db_*
fonctions qui valident l'entrée je passe dans les requêtes afin que je puisse gérer utilisations plus avancées vérifier où le tableau $ids
vient de
Voici un code de test qui fonctionne bien pour moi dans des dizaines de situations.
function db_number_list($lst)
{
if(!$lst)
return "0"; // if there are no passed in values , return a 0
if (!is_array($lst))
$lst = explode (",",$lst); //if a lst was passed in, create an array
foreach ($lst as $k=>$val)
{
if(!is_numeric(trim($val)))
unset($lst[$k]);//remove non-numeric values;
}
if(!count($lst))
return "0"; //if nothing is in the array after removing non-numeric values, return 0
return implode (",",$lst);
}
$ids=array();
$query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")";
echo "ids:'".print_r($ids,true)."'<br>$query<hr>";
$ids="1,2,45,6,";
$query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")";
echo "ids:'".print_r($ids,true)."'<br>$query<hr>";
$ids=array(3,6,1,"drop table x", 4);
$query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")";
echo "ids:'".print_r($ids,true)."'<br>$query<hr>";
Sortie:
ids:'Array () '
SELECT * FROM user WHERE user_id IN (0)
ids:'1,2,45,6,'
SELECT * FROM user WHERE user_id IN (1,2,45,6)
ids:'Array ([0] => 3 [1] => 6 [2] => 1 [3] => drop table x [4] => 4) '
SELECT * FROM user WHERE user_id IN (3,6,1,4)
Pourquoi ne pas vérifier uniquement la matrice vide? MySQL attend juste certains paramètres après IN, donc je suppose qu'il n'y a aucun moyen –
J'espère que $ ids ne sont pas fournis par l'utilisateur et si, vous les échappez correctement, avant de les insérer dans votre requête. – knittl
J'ai une situation où je ne peux pas vérifier le tableau vide. Je devais faire courir la requête sans erreur. Tout ce que je peux faire est de changer le paramètre d'entrée. Les requêtes lancées retournent le résultat zéro est ok pour moi. –