2014-09-30 71 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子句是我發現自己一直在做的事情。