2014-07-16 152 views
0

我想根据勾选的复选框筛选mysql结果。我的查询在第一次检查时有效,但在第二次过滤器上没有任何回应。我的复选框数组是$ _POST ['country'],我在GetSQLValueString函数中创建逗号分隔值 - (英国,法国)等。我使用MySQL IN子句进行多选。基于复选框筛选mysql结果

我需要它来过滤多个国家选择

if (isset($_POST['country_submit']) && $_POST['country'] != '') { 
    mysql_select_db($database_tub, $tub); 
    $query_trade = sprintf(" 
SELECT u.user_id, 
     u.contact_person, 
     u.company, 
     u.country, 
     u.pic_small, 
     u.website, 
     SUM(u.trader_or_bond = %s 
      AND t.user_id IS NOT NULL) AS count 
FROM users u 
LEFT JOIN trading t ON u.user_id = t.user_id 
WHERE u.trader_or_bond = %s AND u.country IN(%s) 
GROUP BY u.user_id 
ORDER BY COUNT(t.user_id) DESC", 
GetSQLValueString('trader', "text"), 
GetSQLValueString('trader', "text"), 
GetSQLValueString(implode(',', $_POST['country']), "text")); 
    $trade = mysql_query($query_trade, $tub) or die(mysql_error()); 
} 
+0

是$ _POST ['country']是一个(非数字)字符串数组吗?如果是这样,'u.country IN(%s)'将成为'u.country IN(英国,法国)',这是SQL中的错误。正确的形式是'u.country IN(“英国”,“法国”)'(逃过)“。 – Bobby

+0

我可以用周围的国家用单引号使它工作,例如$ SingleQuotes =”'“.implode '','“,$ _POST ['country'])。”'“;我必须直接将它放入IN($ SingleQuotes)子句中,以免它通过GetSQLValueString函数 - 我如何才能使它安全? – Jeff

+0

你能提供一个快速的例子,所以我可以看到你的意思吗? – Jeff

回答

0

我想出了这一点,但不能确定是否安全对MySQL注入加上它不干净,因为我想。

if (isset($_POST['country_submit']) && $_POST['country'] != '') { 

$SingleQuotes = "'".implode("', '", array_map('mysql_real_escape_string', $_POST['country']))."'"; 
    mysql_select_db($database_tub, $tub); 
    $query_trade = sprintf(" 
SELECT u.user_id, 
     u.contact_person, 
     u.company, 
     u.country, 
     u.pic_small, 
     u.website, 
     SUM(u.trader_or_bond = %s 
      AND t.user_id IS NOT NULL) AS count 
FROM users u 
LEFT JOIN trading t ON u.user_id = t.user_id 
WHERE u.trader_or_bond = %s AND u.country IN($SingleQuotes) 
GROUP BY u.user_id 
ORDER BY COUNT(t.user_id) DESC", 
GetSQLValueString('trader', "text"), 
GetSQLValueString('trader', "text")); 
$trade = mysql_query($query_trade, $tub) or die(mysql_error()); 
}