#javascript #php #mysql #google-visualization
Вопрос:
Я создал скрипт для создания круговой диаграммы на основе данных из моей базы данных. Он отлично отображает рабочее время в зависимости от отдела. Однако я не могу отображать данные, фильтруя их между датами. Могу ли я узнать, что или как нужно исправить код для фильтрации. В базе данных я уже создал метку времени с именем «CreatedOn».
<?php
try {
$query = $connection->prepare("SELECT Department, SUM(workHrs) as number FROM serviceapplication GROUP BY Department");
$query->execute();
$query->setFetchMode(PDO::FETCH_ASSOC);
$data = $query->fetchAll();
// var_dump($data);
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Department', 'Work Hours'],
<?php
foreach($data as $data) :
echo "['".$data["Department"]."', ".$data["number"]."],";
endforeach;
?>
]);
var options = {
backgroundColor: "none",
title: '',
width: 900,
height: 500,
pieHole: 0.5,
colors: ['#4c325c', '#8ea5cc', '#aa579f', '#391d9d', '#fcbd9c', '#dc346c'],
};
var chart = new google.visualization.PieChart(document.getElementById('piechart'));
chart.draw(data, options);
}
</script>
<form action="" method="GET">
<label class="text-secondary">From Date</label>
<input type="date" name="from_date2" value="<?php if(isset($_GET['from_date2'])){ echo $_GET['from_date2']; } ?>" class="form-control">
<label class="text-secondary">To Date</label>
<input type="date" name="to_date2" value="<?php if(isset($_GET['to_date2'])){ echo $_GET['to_date2']; } ?>" class="form-control">
<label class="text-secondary">Filter</label> <br>
<button type="submit" class="btn btn-primary">Filter</button>
</form>
<br>
<?php
if(isset($_GET['from_date2']) amp;amp; isset($_GET['to_date2']))
{
$from_date2 = $_GET['from_date2'];
$to_date2 = $_GET['to_date2'];
try {
$query = $connection->prepare("SELECT * FROM serviceapplication WHERE CreatedOn BETWEEN '$from_date2' AND '$to_date2' ");
$query->execute();
$query->setFetchMode(PDO::FETCH_ASSOC);
$data = $query->fetchAll();
$count = 0;
// var_dump($data);
} catch (PDOException $e) {
echo $e->getMessage();
}
foreach($data as $data) :
?>
<div id="piechart"></div>
<?php
endforeach;
}
?>
Комментарии:
1. Внимание: Ваш код уязвим для атак с использованием SQL — инъекций. Вы должны использовать подготовленные инструкции и параметры , чтобы предотвратить компрометацию вашей базы данных злоумышленниками с помощью вредоносных входных значений. bobby-tables.com дает объяснение рисков, а также некоторые примеры того, как безопасно писать ваши запросы с помощью PHP / PDO. Никогда не вставляйте необработанные данные непосредственно в свой SQL. Судя по тому, как сейчас написан ваш код, кто-то может легко украсть, неправильно изменить или даже удалить ваши данные.
Ответ №1:
- Модифицированный код , вам необходимо соответствующим образом установить массив данных$.
- Фильтр — группировка по столбцам и обязательным полям (в настоящее время я сгруппирован по отделам)
try { if (isset($_GET['from_date2']) amp;amp; isset($_GET['to_date2'])) { $from_date2 = $_GET['from_date2']; $to_date2 = $_GET['to_date2']; //SQL injection you can handle $query = $connection->prepare("SELECT Department, SUM(workHrs) as number FROM serviceapplication WHERE CreatedOn BETWEEN ? AND ? GROUP BY Department"); //$query->bind_param("ss", $from_date2, $to_date2); $query->execute(array($from_date2, $to_date2)); //$query->execute(); $query->setFetchMode(PDO::FETCH_ASSOC); $data = $query->fetchAll(); $count = 0; echo "data goes here = date filter ";print_r($data); } else { $query = $connection->prepare("SELECT Department, SUM(workHrs) as number FROM serviceapplication GROUP BY Department"); $query->execute(); $query->setFetchMode(PDO::FETCH_ASSOC); $data = $query->fetchAll(); echo "data goes here";print_r($data); } } catch (PDOException $e) { echo $e->getMessage(); } ?> <head> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript"> google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ ['Department', 'Work Hours'], <?php foreach($data as $data) : echo "['".$data["Department"]."', ".$data["number"]."],"; endforeach; ?> ]); var options = { backgroundColor: "none", title: '', width: 900, height: 500, pieHole: 0.5, colors: ['#4c325c', '#8ea5cc', '#aa579f', '#391d9d', '#fcbd9c', '#dc346c'], }; var chart = new google.visualization.PieChart(document.getElementById('piechart')); chart.draw(data, options); } </script> <form action="" method="GET"> <label class="text-secondary">From Date</label> <input type="date" name="from_date2" value="<?php if(isset($_GET['from_date2'])){ echo $_GET['from_date2']; } ?>" class="form-control"> <label class="text-secondary">To Date</label> <input type="date" name="to_date2" value="<?php if(isset($_GET['to_date2'])){ echo $_GET['to_date2']; } ?>" class="form-control"> <label class="text-secondary">Filter</label> <br> <button type="submit" class="btn btn-primary">Filter</button> </form> <br> <?php print_r($data); foreach($data as $dat) : ?> <div id="piechart"></div> <?php endforeach; ?>
Комментарии:
1. Спасибо Senthil за измененный код….могу ли я знать, где разместить JavaScript круговой диаграммы и <div id=»piechart»><div id=»piechart»></div> из вашего измененного кода…
2. Поставьте все как есть , просто переместите логику фильтра даты (для однократного запроса и отображения данных в базе html-кода) в верхний блок, как показано в моем коде ref.
3. Я получаю эту ошибку синтаксического анализа: синтаксическая ошибка, неожиданный токен «catch»….
4. Обратитесь к обновленному коду в разделе ответов.
5. Основная причина-фильтр по дате , по которому мы пропустили группу . Пересмотренное условие запроса для фильтра даты $запрос = $подключение->подготовка(«ВЫБЕРИТЕ отдел, СУММА(рабочие часы) в качестве номера ИЗ приложения К сервису, ГДЕ СОЗДАНО МЕЖДУ ? И ? ГРУППА ПО отделам»);