2014-09-30 68 views
2

我有一个事件数据库,我希望用户能够通过复选框分组 - 复选框状态,月份等实时过滤事件。同组同一个名字:name="state"所有状态复选框,name="month"所有月份复选框等使用AJAX和复选框动态搜索数据库记录

我有一个功能,只要在页面上的任何复选框,单击并试图三种方法来输出所选择的值火灾:

方法1

var state = $('input[name="state"]:checked').map(function() { 
     return "'"+$(this).val()+"'"; 
    }).get().join(","); 
var month = $('input[name="month"]:checked').map(function() { 
     return "'"+$(this).val()+"'"; 
    }).get().join(",") 

例的console.log在页面上进行选择时的样子

'Alaska','Arkansas','California' 'January','February','March' 

方法2

var formData = $('#form').serialize(); 

例的console.log当页面上进行选择看起来像

state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March 

在页面上进行选择时,方法3

var jsonData = JSON.stringify(formData); 

例的console.log看起来像

"state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March" 

我都试过GETPOST类型的AJAX。我认为POST是我所追求的; ,让我给JSON.stringify发送到我的个人PHP变量,运行$data = json_decode(stripslashes($_POST['data']));字符串解码,当我echo "$data";回到我的HTML页面,我得到我选中的复选框值的动态列表/取消他们:

state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March 

我需要帮助才能找到如何获取所选复选框的值并查询我的数据库以返回与当前选中的复选框匹配的任何记录。我试过

$sql="SELECT * FROM events WHERE state = '".$state."' OR month = '".$month."'"; 

$sql="SELECT * FROM events WHERE month REGEXP 'January|February|March|...'" 

$sql="SELECT * FROM events WHERE (state = 'Alabama' OR state = 'Alaska' OR...) OR (month = 'January' OR month = 'February' OR...)"; 

我觉得这只是我缺少PHP的福,你都可以见识一下一个简单的解决方案,我一直无知地俯视。我也很乐意接受这种错误的方式。我想知道如何以最好的方式做到这一点。我的PHP知识显然不足,请使用小字。

- 编辑1 -
的复选框遵循此模式:

<li class="filter-item"> 
<label class="checkbox" for="January"> 
    <input type="checkbox" class="month" id="January" value="January" name="month"> January 
</label> 
</li> 
<li class="filter-item"> 
<label class="checkbox" for="February"> 
    <input type="checkbox" class="month" id="February" value="February" name="month"> February 
</label> 
</li> 
... 

- 编辑2 -
我试过下面的PHP和没有结果;回声甚至不会推出选定的值。

$state_values = $_POST['state']; 
$month_values = $_POST['month']; 

$con = mysqli_connect('localhost','****','****','db'); 
if (!$con) { 
    die('Could not connect: ' . mysqli_error($con)); 
} 

$state_values = array_map(function($val) use ($con){ 
    return $con->real_escape_string($val); 
}); 
$states = implode('|', $state_values); 

$month_values = array_map(function($val) use ($con){ 
    return $con->real_escape_string($val); 
}); 
$months = implode('|', $month_values); 


mysqli_select_db($con,"events"); 

$sql="SELECT * FROM events WHERE state REGEXP '$states'"; 

$result = mysqli_query($con,$sql); 

echo "$state_values"; 

while($row = mysqli_fetch_array($result)) { 
echo '<div class="panel panel-default">'; 
echo '<div class="panel-heading">'; 
echo '<span class="lead">' . $row['name'] . '</span><br>'; 
echo '<span class="small">' . $row['description'] . '</span>'; 
echo '</div>'; 
echo '<div class="panel-body">'; 
echo '<div class="row">'; 
echo '<div class="col-4 col-sm-4 col-lg-4">'; 
echo '<span class="glyphicon glyphicon-calendar"></span>' . $row['month'] .' ' . $row['day'] . ', ' . $row['year'] . '</div>'; 
echo '<div class="col-4 col-sm-4 col-lg-4">'; 
echo '<span class="glyphicon glyphicon-map-marker"></span>' . $row['city'] . ', ' . $row['state'] . '</div>'; 
echo '<div class="col-4 col-sm-4 col-lg-4">'; 
echo '<a href="' . $row['url'] . '" class="btn btn-primary btn-sm pull-right" target="_blank">Visit Race Site</a></div>'; 
echo '</div>'; 
echo '</div>'; 
echo '</div>'; 
} 

mysqli_close($con); 
+0

你有他们的形式标记? – Ghost 2014-09-30 01:18:18

回答

0

的东西,你可以提交表单到PHP,当你有一个像一组复选框的多值形式变量做,你可以为它们命名name[]month[]代替namemonth。我看你是使用jQuery,所以不是地图,你可以使用jQuery的serialize

var data=$('#yourForm').serialize(); 

将返回类似

state[]=Alaska&state[]=Arkansas&state[]=California&month[]=January&month[]=February&month[]=March 

可以传递到PHP脚本,阿贾克斯,那么当他们得到发送到$_POST PHP将解释为array push syntax,所以$_POST['state']$_POST['month']将数组而不是字符串。然后implode

$stateList=implode("','",$_POST['state']); //'Alaska','Arkansas','California' 
$monthList=implode("','",$_POST['month']); //'January','February','March' 

,然后SQL将

$query='SELECT * FROM events WHERE state IN ('.$stateList.') OR month IN ('.$monthList.')'; 

所以我不认为这种情况必然要求任何正则表达式。 imploding复制框值从一个表格推入sql IN子句是我发现自己一直在做的事情。