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