2011-01-17 2 views
1

Est-il possible de sélectionner des données avec une seule requête d'une table mysql avec une chaîne de valeurs? J'ai la requête suivante et j'essaie de récupérer des résultats où la classe c.id_category n'est pas égale à l'une des valeurs dans la chaîne. qui consisterait à quelque chose comme "1,67,23,34,65"PHP MySQL! =/W Liste de valeurs

'SELECT DISTINCT c.*, 
      cl.* 
    FROM `'._DB_PREFIX_.'category` c 
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` 
              AND `id_lang` = '.intval($params['cookie']->id_lang).') 
LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`) 
    WHERE 1'.(intval($maxdepth) != 0 ? ' 
     AND `level_depth` <= '.intval($maxdepth) : '').' 
     AND (c.`active` = 1 OR c.`id_category`= 1) 
     AND c.`id_category` != VAR_ARRAY 
     AND cg.`id_group` '.(!$cookie->id_customer ? '= 1' : 'IN (SELECT id_group 
                    FROM '._DB_PREFIX_.'customer_group 
                    WHERE id_customer = '.intval($cookie->id_customer).')').' 
ORDER BY `level_depth` ASC, cl.`name` ASC' 
+5

Vous n'échappez pas au cookie. Cela peut entraîner une injection SQL. –

+0

'... ET c.id_category NOT IN (1, 67, 23, 34, 65)' – thetaiko

Répondre

2

Quelque chose comme: SELECT * FROM Foo WHERE bar NOT IN (1,67,23,34,65); semble correspondre à vos besoins.

1

Bien sûr, changer dans

ET c. id_category NOT IN (var_array)

0

Essayez ceci:

SELECT DISTINCT c.*, cl.* 
    FROM `'._DB_PREFIX_.'category` c 
    LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.intval($params['cookie']->id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`) 
    WHERE 1' 
    .(intval($maxdepth) != 0 ? ' AND `level_depth` <= '.intval($maxdepth) : '').' 
    AND (c.`active` = 1 OR c.`id_category`= 1) 
    AND c.`id_category` NOT IN (VAR_ARRAY) 
    AND cg.`id_group` '.(!$cookie->id_customer ? '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').' 
    ORDER BY `level_depth` ASC, cl.`name` ASC' 
0

Je pense que vous pouvez utiliser

SELECT * 
FROM TABLE t 
WHERE t.id_category NOT IN ('1', '67', '23', '34', '65') 
0

Vous pouvez utiliser le IN opérateur pour vérifier si une valeur est dans une liste de valeur, de sorte que vous pouvez écrire la condition comme

AND c.id_category in (1,67,23,34,65) 

Parce que la chaîne contient la valeur dans ce format, vous pouvez construire la requête comme ceci:

"AND c.id_category in (" . VAR_ARRAY . ")" 

Mais si cette chaîne provient d'une source externe, vous devez vérifier cette chaîne pour les valeurs non valides pour empêcher l'injection SQL. Il est préférable d'exploser la chaîne pour séparer les valeurs, les convertir en int et créer une nouvelle chaîne à partir de ces valeurs. De cette façon, vous éviterez l'injection SQL.

+0

"où la c.id_category n'est pas égale à l'une des valeurs de la chaîne" (majuscules ajoutées pour l'accentuation) –