Как сделать многокомпонентный PHP-запрос mysql db

Я прочитал сотни постов здесь и на других сайтах. Я не слишком знаком с PHP и mysql, но уже построил свои таблицы в mysql, вызывал их с помощью отдельных контрольных списков и фильтровал их по дате и времени. Однако на арене с несколькими флажками я не могу точно определить, что я делаю неправильно для кода массива и настройки результирующей таблицы. Это основной HTML:

<html> <body> <form method="POST" action="php/minute_feedback.php">
Date: <input type="text" name="from_date" id="from_date" value="2016-04-07">
<input type="checkbox" name="check_list[]" value="gate" id="gate">
<input type="checkbox" name="check_list[]" value="pressure" id="pressure">
<input type="checkbox" name="check_list[]" value="flow" id="flow">
<input type="submit" name="submit" value="submit">

Это базовый PHP (я буду включать только параметры даты и даты & время держать его короче, так как включение будет таким же):

<?php
$servername = "myhostaddress.com";
$username = "myusername";
$password = "mypassword";
$dbname = "mydatabasename";
$conn=new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);}
if($_POST['submit'] == "submit") {
$from_date = ($_POST['from_date']);
$to_date = ($_POST['from_date']);}
if(isset($_POST['submit'])) {

Теперь … я знаю, что здесь должен быть какой-то код массива, например:

$checklist[] = $_POST[check_list];

Но — я не уверен, каков правильный синтаксис / код.
Следующий вопрос о моем запросе. Я видел большинство запросов с использованием комбинации WHERE + IN и «*» для SELECT. Тем не менее, мне нужно что-то ближе к:

$sql = "SELECT Fdate, Ftime, (list of variable columns from the checked options such as 'gate', 'pressure', 'flow' --> but only if they've been checked) FROM minute_db WHERE Fdate BETWEEN '$from_date' AND '$to_date'";

$result = $conn->query($sql);}
if ($result->num_rows > 0) {

Теперь — что касается моих заголовков таблиц, я могу использовать следующий код, если у меня было одно поисковое значение:

echo "<table><tr><th>Date</th><th>Time</th><th>Level (ft)</th></tr>";}

Но мне нужно, чтобы заголовок динамически заполнялся результатами проверенных элементов (1, 2 или 3 или более переменных по мере необходимости) плюс записи даты и времени.

echo "<table>";}
else {
echo "0 results";}
$conn->close();
?>

Мой конечный результат заключается в том, что пользователь может ввести диапазон даты и времени и выбрать, какие данные отображать, поэтому, например, если они хотят знать только настройки ворот и давление на 4/7/2016, они вводят эту дату и установите эти два флажка, чтобы они получили таблицу (без форматирования ниже — просто пытаюсь представить), например:

Date       |     Time |   Gate Setting  |  Pressure
----------------------------------------------------
2016-04-07 |    11:00 |      21         |      50

В конечном итоге у меня будет таблица с десятками тысяч строк данных для выбора (и я буду включать ограничители на объем данных, которые можно извлечь) и до 56 столбцов переменных для выбора. Я не использую никаких специальных / причудливых математических функций для группировки периодов времени и т. Д. — я уже вручную выделил все это и загрузил, чтобы он был готов к работе. Я пробовал много разных решений из интернета, но в конечном итоге потерпел неудачу. Опция * для SELECT не похожа на то, что я, как и опция IN — но я не уверен (просто предположение, что ни один из них не сработал). Я нахожусь на платформе Netfirms MySQL, поэтому она довольно обновлена ​​(и я буду менять все на MySQL, чтобы избежать любых проблем, связанных с его неиспользованием — поэтому любая обратная связь с этим заранее будет УДИВИТЕЛЬНОЙ !!. Я ценю любые идеи у тебя есть!

3

Решение

$checklist     = $_POST['check_list'];
$allowedFields = [
'gate'     => 'Gate',
'pressure' => 'Pressure',
'flow'     => 'Flow',
'etc'      => 'Other field title'
];
$wantedFields   = [];
$tableDynFields = [];
foreach ($checklist as $field) {
if (array_key_exists($field, $allowedFields)) {
$wantedFields[]   = $field;
$tableDynFields[] = $allowedFields[$field];
}
}
if ($wantedFields) {
$wantedFields = join(',', $wantedFields) . ',';
} else {
$wantedFields = '';
}
$sql = "SELECT Ftime, {$wantedFields} Fdate FROM ...';
// and here you have $tableDynFields array for table generation
-1

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

Благодаря вышеприведенному решению Deep — он работает как есть! КЛАССНО. Что касается использования массива таблицы, я боролся, потому что мог заполнять таблицу, но получал дубликаты даты и времени (как отмечено в моих ответах выше). Однако — я просто немного передвинул сценарий, и он работает. Теперь пользователь получит обратно столбцы с датой, временем, а затем дополнительные переменные, которые он ищет, бок о бок, по всей странице, в качестве сравнительных значений (примечание — я еще не дошел до mysqli или pdo , так что если это старый, пожалуйста, обновите, как вам нужно). Надеюсь, это поможет — и еще раз спасибо! Итак, из строки sql из поста Дипа выше (полностью заполненного) это таблица ->

$sql = "SELECT Fdate, {$wantedFields} Ftime FROM minute_db WHERE Fdate BETWEEN '$from_date' AND '$to_date' AND Ftime BETWEEN '$from_time' AND '$to_time'";

$result = $conn->query($sql);
}
if ($result->num_rows > 0) {
//header fields
echo "<table><tr><th>Date</th><th>Time</th>";
foreach($tableDynFields as $c) {
echo "<th>$c</th>";
}
echo "</tr>";
//results
while ($row = $result->fetch_assoc()) {
echo "<tr><td>".$row["Fdate"]."</td><td>".$row["Ftime"]."  </td>";
foreach($tableDynFields as $c) {
echo "<td>".$row[$c]."</td>";
}
echo "</tr>";
}
echo "</table>";
//result set free
$result->free();
} else {
echo "query failed.<hr/>";
}
$conn->close();
?>

Единственное, что я добавлю, — это если вам нужно отфильтровать и отсортировать столько данных, сколько я — это хорошо, либо поставить принудительный ограничитель в конце оператора select, либо что-то в этом роде!

0

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