【问题标题】:Using ajax and checkboxes for dynamic search of database records使用 ajax 和复选框动态搜索数据库记录
【发布时间】:2014-09-30 11:44:49
【问题描述】:

我有一个事件数据库,我希望用户能够通过复选框分组实时过滤事件 - 状态、月份等。我在同一组中为复选框赋予了相同的名称:name="state"对于所有状态复选框,name="month" 对于所有月份复选框等。

我有一个函数,只要点击页面上的任何复选框就会触发,并尝试了三种方法来输出选定的值:

方法一

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'

方法二

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"

我已经为 ajax 尝试了 GETPOST 类型。我认为 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-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);

【问题讨论】:

  • 你有它们的表单标记吗?

标签: php mysql ajax checkbox


【解决方案1】:

您可以将表单提交到 php,当您有一个多值表单变量(如一组复选框)时,您可以将它们命名为 name[]month[] 而不是 namemonth。我看到你使用的是 jQuery,所以你可以使用 jQuery 的 serialize 来代替 map

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

会返回类似的东西

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

您可以通过 ajax 将其传递给您的 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 子句是我发现自己一直在做的事情。

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多