我有代表产品状况的复选框。当用户检查例如Excellent
时,值1
存储在GET
变量中,如下所示:
...index.php?condition=1
现在,当用户选中多个框(必须可能)时,它看起来像这样:
...index.php?condition=1,2,3
显然,我必须查询我的数据库才能显示与用户选择相对应的产品。
如果用户只选中一个框,则语句很简单:
if (!empty($_GET['condition'])){
$sql = $sql . " AND (Condition = '".$_GET['condition']."')";
}
但是,如果用户选中多个框怎么办?声明必须如何?(甚至可以这样解决吗?
谢谢!
这是创建地址的脚本:
<script>
$('#condition_select input:checkbox').change(function() {
var condition = $("#condition_select input:checkbox:checked").map(function() {
return this.value;
}).get().join(',');
$("#submit_checkboxes").find("a").attr('href', 'index.php?condition=' + condition);
}).change();
</script>
.HTML:
<div class="mutliselect" id="condition_select">
<form method="POST" action="">
<ul>
<li><input type="checkbox" id="d1" value="1"'; if(strpos($_GET['condition'],'1') !== false){ echo 'checked="checked"';} echo'/><label for="d1" class="checkbox_title">Neu</label></li>
<!-- and 6 more of these -->
有没有办法解决这个问题,而不必为每个复选框创建一个单独的GET
变量?
UPDATE(再次更新,补充评论和问题更新):
问题已更新,所以我将更新我的答案。使用 explode (http://php.net/manual/en/function.explode.php) 获取所有值,并使用 implode 来表述查询:
$values = explode(',', $_GET['condition']);
// VALIDATE each of values to match Your type.
if (!empty($values)) {
// $values = [1, 2, 3]
foreach ($values as $key => $value) {
$values[$key] = '(condition = '''.$value.''')';
}
// $values = ['(condition = ''1'')', '(condition = ''2'')', '(condition = ''3'')']
$query = implode(' OR ', $values);
// $query = '(condition = ''1'') OR (condition = ''2'') OR (condition = ''3'')',
$sql = $sql . ' AND ( '.$query.' )';
}
我认为这是您的解决方案(MYSQL 倍数和:http://forums.mysql.com/read.php?10,250552)。爆炸工作示例:
$string = '1,2,3,4,asd,fgh';
$array = explode(',', $string);
print_r($array[0]); // 1
print_r($array[3]); // 4
print_r($array[5]); // 'fgh'
这是编辑前的答案片段,但我认为值得留在这里:
Hoverwer,里面有很多安全漏洞!!
您必须验证用户数据。例如,如果有人传入地址:
index.php?condition=; SHOW TABLES FROM database;
它可能会显示一些数据。如您所见,用户还可以使用删除状态或插入用户来访问地址...等。
因此,在这种情况下,您应该切换到PDO(例如)http://php.net/manual/en/pdo.prepare.php,并进行准备好的陈述。验证用户数据,以便如果您需要号码,他只能传递号码。
你也可以使用 isset:isset vs empty vs is_null。这不是必须的,但有时可能很有用。对于每个表单,您还可以检查isset($_POST['submit'])作为许多机器人发送垃圾邮件POST表单,有时只是省略提交按钮。我认为这将减少请求的数量。
请记住,使用POST和GET表单始终允许用户发送自己的POST/GET请求。在这种情况下,服务器端验证是必须的。
对不起,大写字母,它们仅用于使其真正强大。验证用户数据;)。
此致敬意。