#php #html #mysql #checkbox
#php #HTML #mysql #флажок
Вопрос:
В настоящее время у меня есть веб-страница html / PHP, которая использует серию пользовательских вводов для запроса базы данных SQL и возврата данных для построения графика. Пользовательский ввод управляется флажками html, управляемыми данными в базе данных SQL и созданными с использованием кода PHP. Весь html-код слишком велик, чтобы помещать его здесь, но ниже приведен отрывок из части, о которой я хочу спросить…
…
<div id="AccProject" class="w3-hide">
<?php
$queryProject = "SELECT DISTINCT ProjID, Project, Sample, Type, Description FROM PROJECTS ORDER BY Project ASC";
$resultProject = $dbhandle->query($queryProject) or exit("Error code ({$dbhandle->errno}): {$dbhandle->error}");
while($row=mysqli_fetch_array($resultProject)){
echo "<input id='".$row['ProjID']."' value='".$row['ProjID']."' name='projID[]' type='checkbox' class='chkbox'>";
echo "<label title='".$row['Description']."amp;#13;amp;#13;Project: ".$row['Project']."amp;#13;Sample: ".$row['Sample']."amp;#13;Type: ".$row['Type']."' for='".$row['ProjID']."' class='chkbox-label'> ".$row['Project']." | ".$row['Sample']." | ".$row['Type']."</label>";
}
?>
</div>
…
Вы можете видеть, что я запрашиваю базу данных SQL, возвращаю несколько полей, а затем использую PHP для создания нескольких флажков. Позже в html я использую javascript для извлечения состояния checked / unchecked этих флажков и повторного запроса к базе данных, чтобы вернуть больше данных.
Что я хотел бы сделать, так это добавить ряд предварительных фильтров, которые уменьшат количество флажков, видимых пользователю на странице. Например, если поле «Тип» определяет, является ли ввод данных «Тортом», «Бисквитом» или «Пудингом», я хотел бы добавить некоторые переключатели, которые затем изменят SQL-запрос. Ниже я привел пример с некоторым псевдокодом.
…
<div id="AccProject" class="w3-hide">
<label class="form-switch"><input type="checkbox" id="filterCake"><i></i> Select Cakes only </label>
<label class="form-switch"><input type="checkbox" id="filterBiscuit"><i></i> Select Biscuits only </label>
<label class="form-switch"><input type="checkbox" id="filterPudding"><i></i> Select Puddings only </label>
<?php
if filterCake == True
$queryProject = "SELECT DISTINCT ProjID, Project, Sample, Type, Description FROM PROJECTS WHERE Type == 'Cake' ORDER BY Project ASC";
if filterBiscuit == True
$queryProject = "SELECT DISTINCT ProjID, Project, Sample, Type, Description FROM PROJECTS WHERE Type == 'Biscuit' ORDER BY Project ASC";
if filterPudding == True
$queryProject = "SELECT DISTINCT ProjID, Project, Sample, Type, Description FROM PROJECTS WHERE Type == 'Pudding' ORDER BY Project ASC";
$resultProject = $dbhandle->query($queryProject) or exit("Error code ({$dbhandle->errno}): {$dbhandle->error}");
while($row=mysqli_fetch_array($resultProject)){
echo "<input id='".$row['ProjID']."' value='".$row['ProjID']."' name='projID[]' type='checkbox' class='chkbox'>";
echo "<label title='".$row['Description']."amp;#13;amp;#13;Project: ".$row['Project']."amp;#13;Sample: ".$row['Sample']."amp;#13;Type: ".$row['Type']."' for='".$row['ProjID']."' class='chkbox-label'> ".$row['Project']." | ".$row['Sample']." | ".$row['Type']."</label>";
}
?>
</div>
…
Как я могу добиться этого с помощью своего кода?
Все, что мне нужно сделать, это изменить SQL-запрос в коде PHP (добавив предложение WHERE) на основе состояния флажков для торта, печенья или пудинга, но я изо всех сил пытался понять, как это сделать.
Любая помощь с благодарностью!
Комментарии:
1. Итак, в основном проверьте с помощью JS, какие поля проверяются и на основе этого выполняются разные запросы?
2. Вы можете параметризовать
type
в своем SQL и передать его в оператор в зависимости от значения, полученного от интерфейса3. слишком много запросов замедляет производительность базы данных
4. @MoisheySchwartz это была первоначальная мысль, но поскольку запрос находится в php, как мне поместить javascript в php?
5. Рассматривался AJAX?
Ответ №1:
Вам нужно будет делать это с помощью AJAX, и каждый раз, когда пользователь нажимает на флажок, отправляйте значение на другую страницу, а затем вы можете либо перебирать результаты с помощью PHP на другой странице и возвращать их в HTML, либо возвращать результаты и перебирать их с помощью JS на странице с флажками
Смотрите несколько примеров:
$("#formName").on("change", "input:checkbox", function(){
//send $(this).val() with ajax
//Assuming you are selecting cakes and
//getting back an array with cakes
//you are the looping thru the array and gettig populating the html
var response = [];
var cakes = {};
cakes.description = 'Cake Description 1';
cakes.project = 'Cake Project 1';
response.push(cakes);
cakes = {};
cakes.description = 'Cake Description 2';
cakes.project = 'Cake Project 2';
response.push(cakes);
var formattedResponse = '';
response.forEach(function(res){
formattedResponse = `This is ${res.description} <br>`});
$('#responseContainer').html(formattedResponse);
});
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
<form action="" id="formName">
<label class="form-switch"><input type="checkbox" value="cake" id="filterCake"><i></i> Select Cakes only </label>
<label class="form-switch"><input type="checkbox" value="biscuits" id="filterBiscuit"><i></i> Select Biscuits only </label>
<label class="form-switch"><input type="checkbox" value="puddings" id="filterPudding"><i></i> Select Puddings only </label>
</from>
<div id="responseContainer"></div>
Комментарии:
1. Ajax с циклическим перебором результатов с использованием javascript кажется самым чистым решением. Знаете ли вы какие-либо примеры, которые я мог бы просмотреть, а затем применить к своему коду?
Ответ №2:
да, вы можете извлекать данные из базы данных, создавая динамический запрос. Пожалуйста, попробуйте это.
$type = $post[‘type’]; // ‘Торт’,’Печенье’,’Пудинг’
$queryProject = «ВЫБЕРИТЕ ОТДЕЛЬНЫЙ идентификатор проекта, проект, Образец, тип, Описание ИЗ ПРОЕКТОВ, ГДЕ Type = ‘» . $type .»‘ ПОРЯДОК ПО проекту ASC»;
Комментарии:
1. Как мне установить post[‘type’] ?
2. с помощью отправки формы или вызова ajax. Лучше было бы вызвать ajax.