Php 使用ajax和复选框动态搜索数据库记录

Php 使用ajax和复选框动态搜索数据库记录,php,mysql,ajax,checkbox,Php,Mysql,Ajax,Checkbox,我有一个事件数据库,我希望用户能够通过状态、月份等复选框分组实时筛选事件。我给同一组中的复选框起了相同的名称:name=“state”所有状态复选框,name=“month”所有月份复选框,等等 我有一个函数,每当单击页面上的任何复选框并尝试三种方法来输出所选值时,就会触发该函数: 方法1 var state = $('input[name="state"]:checked').map(function() { return "'"+$(this).val()+"'";

我有一个事件数据库,我希望用户能够通过状态、月份等复选框分组实时筛选事件。我给同一组中的复选框起了相同的名称:
name=“state”
所有状态复选框,
name=“month”
所有月份复选框,等等

我有一个函数,每当单击页面上的任何复选框并尝试三种方法来输出所选值时,就会触发该函数:

方法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'
state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March
"state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March"
方法2

var formData = $('#form').serialize();
在页面上进行选择时的示例console.log如下所示

'Alaska','Arkansas','California' 'January','February','March'
state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March
"state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March"
方法3

var jsonData = JSON.stringify(formData);
在页面上进行选择时的示例console.log如下所示

'Alaska','Arkansas','California' 'January','February','March'
state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March
"state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March"
我已经为ajax尝试了
GET
POST
两种类型。我认为POST是我所追求的;这允许我将JSON.stringify发送到我的各个PHP变量,运行
$data=JSON\u decode(stripslashes($\u POST['data'])
解码字符串,当I
回显“$data”时返回到我的HTML页面,当我选中/取消选中复选框时,我会得到一个复选框值的动态列表:

state=Alaska&state=Arkansas&state=California&month=January&month=February&month=March
我需要帮助找到如何获取所选复选框的值并查询我的数据库以返回与当前选中复选框匹配的任何记录。我试过了

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

我觉得这只是我缺少php fu,你们都可以启发我一个简单的解决方案,我一直忽视了这个解决方案。我也有可能以错误的方式处理这个问题。我想知道如何用最好的方法来做这件事。我的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,但没有得到任何结果;echo甚至不会推出选定的值

    $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);
    
    $state\u values=$\u POST['state'];
    $month_value=$_POST['month'];
    $con=mysqli_connect('localhost','**','**','db');
    如果(!$con){
    die('无法连接:'。mysqli_错误($con));
    }
    $state\u values=数组映射(函数($val)使用($con){
    返回$con->real\u escape\u字符串($val);
    });
    $states=内爆(“|”,$state_值);
    $month\u values=数组映射(函数($val)使用($con){
    返回$con->real\u escape\u字符串($val);
    });
    $month=内爆(“|”,$month_值);
    mysqli_select_db($con,“事件”);
    $sql=“从状态REGEXP'$states'所在的事件中选择*;
    $result=mysqli\u查询($con,$sql);
    回显“$state_values”;
    while($row=mysqli\u fetch\u数组($result)){
    回声';
    回声';
    回显“.$row['name']”。
    ; 回显'.$row['description'].'; 回声'; 回声'; 回声'; 回声'; 回显“.$row['month'..”..$row['day'..”,“.$row['year'.]”; 回声'; 回显“.$row['city']”,“.$row['state']”; 回声'; 回声'; 回声'; 回声'; 回声'; } mysqli_close($con);
    向php提交表单时可以做的事情,当您有一个多值表单变量(如一组复选框)时,可以将它们命名为
    name[]
    month[]
    ,而不是
    name
    month
    。我看到您正在使用jQuery,所以可以使用jQuery的

    会返回类似于

    state[]=Alaska&state[]=Arkansas&state[]=California&month[]=January&month[]=February&month[]=March
    
    您可以通过ajax将其传递给php脚本,然后当它们被发送到
    $\u POST
    时,php会将它们解释为,因此
    $\u POST['state']
    $\u POST['month']
    将是数组而不是字符串。然后:

    然后sql将是

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

    所以我认为这种情况不一定需要任何正则表达式<代码>内爆
    复选框值从表单中插入到子句中的sql
    ,这是我发现自己一直在做的事情。

    有表单标记吗?