
08.02.2016, 11:35
|
Новичок на форуме
|
|
Регистрация: 08.02.2016
Сообщений: 5
|
|
Передача массива из php в гистограмму js
Есть база телефонии на 20 колонок. Средствами SQL выполняется выборка, делающая три колонки: DATE, COUNT, TIME.
Также есть гистограмма на JS, в файл которой забита высота столбиков.
Но требуется, чтобы данные брались из столбца COUNT, как массив.
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<style type="text/css">
${demo.css}
</style>
<script type="text/javascript">
$.get("DATA.php", {COUNT:$("select[name:'COUNT'].val()
})
$(function () {
$('#container').highcharts({
chart: {
type: 'column'
},
title: {
text: 'Asterisk Replica'
},
xAxis: {
categories: [
'9.00',
'10.00',
'11.00',
'12.00',
'13.00',
'14.00',
'15.00',
'16.00',
'17.00',
'18.00',
],
crosshair: true
},
yAxis: {
min: 0,
title: {
text: 'COUNT'
}
},
tooltip: {
headerFormat: '<span style="font-size:10px">{point.key}</span><table>',
pointFormat: '<tr><td style="color:{series.color};padding:0">{series.name}: </td>' +
'<td style="padding:0"><b>{point.y:.1f} mm</b></td></tr>',
footerFormat: '</table>',
shared: true,
useHTML: true
},
plotOptions: {
column: {
pointPadding: 0.2,
borderWidth: 0
}
},
series: [{
name: 'DATE',
data: [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1]
}]
});
});
</script>
</head>
<body>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>
</body>
</html>
<?php
$db = new mysqli ('localhost','root','','slave'); //Подключение к базе данных
$query = "sete names 'utf8'";// кодировка
$utf=mysqli_query ($db, $query) ; // кодировка
$query= ("SET SESSION collation_conection = 'utf8_general_ci';") ; // кодировка
$ut=mysqli_query ($db, $query) ; // кодировка
$n=$_REQUEST['n'];//Ассоциативный массив (array), который по умолчанию содержит данные переменных $_GET, $_POST, переменная n - имя переданного параметра (номер страницы). В массиве REQUESt с именем n хранится значение этого параметра.
$start =(($n-1)*6);//Переменная - в которой: 6 - количество записей на страницу, n - номер страницы.
//$start - Номер записи с которой будет выводиться текущая страница
$sqlstring="SELECT DATE_FORMAT(datetime, '%H') as DATE,
COUNT(1) as COUNT, ROUND((sum(Billable))/COUNT(1)) as TIME
FROM `slave`.`cdr_201602`
where datetime > CURDATE() and HOUR(datetime) > 8 and HOUR(datetime) < 18
and (src between 501 and 565 or src=129)
and billable >1
GROUP BY date
order by date
LIMIT $start,6";//перменная, в которой записывается текст запроса
$rs=mysqli_query($db,$sqlstring); //rs записывается результат выполнения функции mysql_query - посылает запрос к бд
//$rs - результат выполнения запроса к бд
$stranswer = ''; //Переменная равная пустому значению
while ($row =mysqli_fetch_assoc($rs)){//Цикл - формирование ассоциативного массива row по текущей записи из набора rs row fetch_assoc параметр rs
$stranswer .=$row['DATE'].'#';//$row - DATE
$stranswer .=$row['COUNT'].'#';//$row - COUNT
$stranswer .=$row['TIME'].';;';//$row - TIME
}
print $stranswer;//печать $stranswer на экран
?>
Посмотрел по форумам, делается это все посредством JSON (encode).
Но где и как его использовать я не понимаю. Сисадмин.
Будьте добры, объясните, где и как правильно дописать код, как решить мою задачку?
|
|

08.02.2016, 12:59
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Sling
|
$n=$_REQUEST['n'];//Ассоциативный массив (array), который по умолчанию содержит данные переменных $_GET, $_POST, переменная n - имя переданного параметра (номер страницы).
|
Если бы так. Из руководства:
Переменные в массиве $_REQUEST передаются в скрипт посредством методов GET, POST или COOKIE, поэтому им нельзя доверять, т.к. они могли быть изменены удаленным пользователем. Их наличие и порядок добавления данных в соответствующие массивы определяется директивой variables_order.
Это к тому, что можно сделать подставу даже не отправляя запрос, а посредством кук с зараженной страницы. У вас для асинхронного запроса используется метод $.get(), значит и нужно получать параметр из массива $_GET, ибо только он в данном случае должен быть определен.
if($n = (int)$_GET['n']) {
//да, есть запрос страницы иначе подстава
}
//или определять 0 как запрос по умолчанию первой страницы
Вот только откуда может взяться в нем ключ 'n', если этот запрос отправляет параметры под ключом COUNT?
Сам запрос как еврей после обрезания - не указана в нем функция обработчик ответа, и не указан ожидаемый тип данных, а сервер не отправляет заголовка типа данных, отправляя непотребное, хотя нужен JSON. Если нужен JSON, то вместо строк 21 - 27 php-кода должны быть:
$stranswer = [];
while ($row =mysqli_fetch_assoc($rs)) $stranswer[] = $row;
echo json_encode($stranswer);
и клиент получит массив объектов, точно соответствующий полученному массиву данных из базы. Но если требуется, чтобы данные брались из столбца COUNT, как массив означает содержание под одним ключом массива всех полученных строк этого поля таблицы, то нужно формировать данные для клиента так:
$stranswer = [];
while ($row =mysqli_fetch_assoc($rs)) {
$stranswer['DATE'][] = $row['DATE'];
$stranswer['COUNT'][] = $row['COUNT'];
$stranswer['TIME'][] = $row['TIME'];
//если # и ;; в данных для разбора строки на клиенте, то выбросить это
}
echo json_encode($stranswer);
А на клиенте запрос должен быть таким:
$.get(
"DATA.php", //не увлекайтесь верхним регистром без надобности
{COUNT : $("select[name:'COUNT'].val()}, //параметр запроса под ключом COUNT
function(data) {
//дата содержит объект, данные полученные от сервера, вот тут и делайте с ними то чего нужно
},
"json" //ожидаемый тип данных, JQ их преобразует в объект
);
Последний раз редактировалось laimas, 08.02.2016 в 13:25.
|
|

08.02.2016, 13:38
|
Новичок на форуме
|
|
Регистрация: 08.02.2016
Сообщений: 5
|
|
n- номер страницы определяемый веб-интерфейсом. Скажем, для запуска тупо пхп файла придется передать параметр ?n=1;
Это в принципе роли не играет, база не будет подразумевать переход по страницам.
|
|

08.02.2016, 14:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Sling
|
Это в принципе роли не играет, база не будет подразумевать переход по страницам.
|
А чего тогда вы хотите расписывая о каких-то переходах, запросах к базе и т.п.?
|
|

08.02.2016, 14:25
|
Новичок на форуме
|
|
Регистрация: 08.02.2016
Сообщений: 5
|
|
Сообщение от laimas
|
$stranswer = [];
while ($row =mysqli_fetch_assoc($rs)) $stranswer[] = $row;
echo json_encode($stranswer);
|
Вот тут я как понял будет передаваться весь массив без сепараторов?
Вот представьте себе гистограмму. Столбиков 8 штук. Высота солбиков должна определяться величиной COUNT. Дело в том что DATE COUNT TIME не записываются в другую таблицу, они показываются как результат выборки SQL. Задача - заставить COUNT-массив переходить к гистограммке в поле data.Ибо там по примеру и рассчитывается величина каждого столбца.
series: [{
name: 'DATE',
data: [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1]
|
|

08.02.2016, 15:22
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Вот этого выполнить отдельно вне запроса клиента, а для отладки:
$stranswer = [];
while ($row =mysqli_fetch_assoc($rs)) {
$stranswer['COUNT'][] = $row['COUNT'];
}
echo '<pre>';
print_r($stranswer);
Что видим? А если этот массив отдать клиенту как JSON (вот тут уж я не знаю где это вам нужно, ибо какая-то темнота с запросами, страницами....), то на клиенте будет массив. Надо непосредственно его при выводе вставить в js-код, ну так вставляйте:
<script>
var obj = <?=json_encode($stranswer)>
</script>
результатом будет:
var obj = {'COUNT' : [массив данных]}
Зачем вам строка с сепараторами?
Вы говорите о каких то данных под ключом COUNT, показываете
series: [{
name: 'DATE',
data: [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1]
Но нигде не видно что из себя представляют данные COUNT.
Если вам надо как-то программно связать данные COUNT с данными series, ну так покажите структур обеих, поясните что должно быть, без разговоров о SQL и прочем не связанным с клиентом. А то гистограмма с какими-то неизвестными...
|
|

09.02.2016, 11:27
|
Новичок на форуме
|
|
Регистрация: 08.02.2016
Сообщений: 5
|
|
"Вы говорите о каких то данных под ключом COUNT, показываете
series: [{
name: 'DATE',
data: [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1]
Но нигде не видно что из себя представляют данные COUNT.
Если вам надо как-то программно связать данные COUNT с данными series, ну так покажите структур обеих, поясните что должно быть, без разговоров о SQL и прочем не связанным с клиентом. А то гистограмма с какими-то неизвестными..."
Выслал пример результата выполнения запроса:
См. изображение.
Требуется, чтобы в series поступал массив, который является частью таблицы, то бишь COUNT. По дефолту гистограмма берет данные из самого файла.
|
|

09.02.2016, 11:43
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Ну так покажите структуру. Ну кто же знает как надо? Так пойдет?
series: [{
name: 'DATE',
data: [49.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1],
count: [1, 2, 3, 4, 5, ....]
Или же надо и как для data указать name: 'DATE'?
К тому же в series поступал массив - каким образом? Ведь вы начали разговор о JSON, а по запросу $.get с параметром COUNT можно предположить, что вернуть на асинхронный запрос, оказалось что там что-то такое, какое не понять.
Если вы понимаете РНР, ну сформируйте массив данных полученных из базы той структуры, которая будет отвечать объекту series. Это вы сможете? Останется json_encode(array) и вы получите ровно то, чего и хотите. А дальше либо непосредственно при выводе вставляйте его на странице, либо на запрос асинхронный, ибо я так и не понял где, когда и почему.
Если сами не можете даже на РНР описать структуру массива, ну хоть на пальцах как-то разъясните где и что должно находится, ну нет тут экстрасенсов.
|
|

09.02.2016, 15:41
|
Новичок на форуме
|
|
Регистрация: 08.02.2016
Сообщений: 5
|
|
Прошу прощения, если не так выразился. В series-имя 'DATE' это просто часть интерфейса как имя на странице, оно роли не играет, хоть абракадабра будет. я говорю про массив 'data'. Это и есть высота столбиков, она забита в самом js, а я имею ввиду, что вместо чисел 'data' должны браться данные из результата выполнения запроса, то бишь из колонки COUNT(см. скрин).
|
|

09.02.2016, 16:15
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Sling
|
что вместо чисел 'data' должны браться данные из результата выполнения запроса, то бишь из колонки COUNT(см. скрин).
|
На снимке собственно говоря представлена html-таблица, а взять из ее колонки, то это операция с DOM, и это можно сделать.
Вы же постоянно спрашиваете как поместить в объект series данные COUNT в виде массива.
Как передать массив данных в формате json, я уже показывал, что еще тут говорить я не знаю.
Но у меня есть встречные вопросы:
1) когда помещать их: а) при открытие страницы клиентом, б) после открытия страницы и асинхронного запроса за данными?
2) вместо чисел 'data' - что это означает: а) удалить из объекта series, данные свойства 'data', заменив их данными COUNT, б) это означает перенаправить запрос некоего сценария со свойства 'data' на свойство 'COUNT'?
3) как эти злочастные COUNT в конце концов должны выглядеть в series - справа, слева, снизу.... Ну уже до анекдота доходит ей богу.
Вы думаете я догадываюсь как это в series должно выглядеть и когда это нужно получить? Я не знаю ей богу чего вам нужно, ибо в пояснениях ваших нет ничего конкретного.
Последний раз редактировалось laimas, 09.02.2016 в 16:18.
|
|
|
|