Использование ajax и флажков для динамического поиска записей базы данных

У меня есть база данных событий, и я хочу, чтобы пользователи могли фильтровать события в режиме реального времени с помощью групп флажков — состояния, месяца и т. Д. Я присвоил флажкам в одной группе одно и то же имя: 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'

Способ 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"

Я пробовал оба GET а также POST типы для 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-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 и не получил результатов; эхо даже не выдвигает выбранные значения.

$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);

2

Решение

Что-то, что вы можете сделать для отправки форм в php, когда у вас есть многозначная переменная формы, такая как группа флажков, вы можете назвать их name[] а также month[] вместо name а также month, Я вижу, вы используете jQuery, поэтому вместо карты вы можете использовать jQuery сериализации

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

вернет что-то вроде

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

Вы можете передать это в свой php-скрипт через ajax, а затем, когда их отправят $_POST PHP будет интерпретировать их как Синтаксис push массива, так $_POST['state'] а также $_POST['month'] будут массивы вместо строк. затем взрываться:

$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 это то, что я делаю все время.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector