JpGraph + MSSQL + PHP

Saratov64

Новичок
Уважаемые, добрый субботний вечер....
проблема ...
задача:
Вывод данных из БД MS SQL на график используя библиотеку JpGraph.


Код ниже следующий:

PHP:
<?php
........ подключение к БД

$db_connect=odbc_connect($DBName, $DBUser, $DBPass);

 
$query ="SELECT ID,name,dattime,q,p,t FROM dbo.gftec
    WHERE ID=1
    AND name='datchik1'
    AND dattime =>2017-01-09
    ORDER BY dattime DESC";
   
       $res = odbc_exec ($db_connect,$query);
        $row = odbc_fetch_row($res);
     
            while ($array = odbc_fetch_array($res)){
                    $ydata[]  = round($array['q']);
                    $ydata2[]  = round($array['p'],1);
                    $ydata3[] = round($array['t'],1);
             
                }
             
                /*for ($i=1; $i <= 380; $i++ ){ //тестовый цикл
                    $q = $data;
                }*/
         
            require_once ('/jpgraph-4.0.2/src/jpgraph.php');
            require_once ('/jpgraph-4.0.2/src/jpgraph_line.php');
           
           // тестовый массив данных для визуализации:
                    //$ydata = array (1,7);
                    //$ydata2 = array(1,4);
                    //$ydata3 = array(1,2);
             
         
                $graph = new Graph(700, 550, 'auto', 10, true);
           
                // Указываем, какие оси использовать:
                $graph->SetScale('textlin');
           

                $lineplot = new LinePlot($ydata, $xdata);
                $lineplot2 = new LinePlot($ydata2, $xdata);
                $lineplot3 = new LinePlot($ydata3, $xdata);
         
             
                // Задаём цвет кривой
                $lineplot->SetColor('forestgreen');
                $lineplot2->SetColor('orange');
                $lineplot3->SetColor('red');
         
                // Присоединяем кривую к графику:
                $graph->Add($lineplot);
                //$graph->Add($lineplot2);
                //$graph->Add($lineplot3);
           
                // Даем графику имя:
                $graph->title->Set('ГРАФИК');

                // Назовем оси:
                $graph->xaxis->title->Set('time');
           
           
                // Выделим оси цветом:
                $graph->xaxis->SetColor('#СС0000');
                $graph->yaxis->SetColor('#СС0000');
           
                // Зададим толщину кривой:
                $lineplot->SetWeight(3);
           
           
                // Фон графика зальем градиентом:
                $graph->SetBackgroundGradient('ivory', 'orange');
           
                // Придадим графику тень:
                $graph->SetShadow(4);
           
                $graph->Stroke();
?>
и так проблема. Хочу вывести из БД три параметра
$ydata= значение расхода
$ydata2= значения давление
$ydata3 = значение температуры (не суть)

При выводе на экран график строиться НЕ корректно!
пример скрина
Посмотреть вложение 1176
коментирую две переменных при выводе из SELECT
//$ydata2[] = round($array['p'],1);
//$ydata3[] = round($array['t'],1);
выводит корректно, НО ОДНУ только ...
привожу скрин
one.jpg
далее тестирую на синтетическом простом примере массивов
$ydata = array (1,7);
$ydata2 = array(1,4);
$ydata3 = array(1,2);
array.jpg
т.е. JpGrapch рабочий. Он не понимает походу мой вывод в массив, который стоит в строчке while

PHP:
while ($array = odbc_fetch_array($res)){
                    $ydata[]  = round($array['q']);
                    $ydata2[]  = round($array['p'],1);
                    $ydata3[] = round($array['t'],1);
             
                }
тестировал вывод из массива через var_dump ($ydata);
выводит все записи
array(364) { [0]=> float(28915) [1]=> float(28915) [2]=> float(28917) [3]=> float(28917) [4]=> float(28955) [5]=> float(28955) [6]=>........ и так далее.
Т.е. и массив есть, и по отдельности переменные $ydata на графике показывает, а все три, не корректно ....

помогите разобраться, поправить мою ошибку.

/ps уровень НОВЕЧЕК
 
Последнее редактирование:

Saratov64

Новичок
Хм?

Что у вас в
max($ydata), min($ydata)
max($ydata2), min($ydata2)
max($ydata3), min($ydata3)
?
Даже не делал макс и мин. Хотя где-то видел, но не понял зачем искать макс и мин, ведь с датчика приходит точка-параметр, я его ставлю на график, но чувствую это надо делать ... Судя по вашему
вопросу
 

WMix

герр M:)ller
Партнер клуба
Больше равно наоборот, >=
Дата пишется в кавычках

То что вывела база можно задампить
print_r($row); end;

А вообще не понятно откуда взялась $xdata, почему ты вытащил сначала fetch_row, а после циклом fetch_array.
 
Последнее редактирование:

Saratov64

Новичок
Больше равно наоборот, >=
Дата пишется в кавычках

То что вывела база можно задампить
print_r($row); end;

А вообще не понятно откуда взялась $xdata, почему ты вытащил сначала fetch_row, а после циклом fetch_array.

AND dattime >= '2017-01-09'
поправил
$row = odbc_fetch_row($res); осталось от прошлого кода... не внимательно, просмотрел, да, тут это не нужно ... поправил
$xdata не нужна мне пока. Брал из примера по настройке JpGraph, опять моя ошибка .... поправил

var_dump ($ydata,$ydata2,$ydata3); сделал дамп всех трех переменных, все возвращает ...

итого

PHP:
<?php

........ подключение к БД

$db_connect=odbc_connect($DBName, $DBUser, $DBPass);

 
$query ="SELECT ID,name,dattime,q,p,t FROM dbo.gftec
    WHERE ID=1
    AND name='datchik1'
    AND dattime  >= '2017-01-09'
    ORDER BY dattime DESC";
  
       $res = odbc_exec ($db_connect,$query);
    
            while ($array = odbc_fetch_array($res)){
                    $ydata[]  = round($array['q']);
                    $ydata2[]  = round($array['p'],1);
                    $ydata3[] = round($array['t'],1);
            
                }
            
              
        
            require_once ('/jpgraph-4.0.2/src/jpgraph.php');
            require_once ('/jpgraph-4.0.2/src/jpgraph_line.php');
          
            
        
                $graph = new Graph(700, 550, 'auto', 10, true);
          
                // Указываем, какие оси использовать:
                $graph->SetScale('textlin');
          

                $lineplot = new LinePlot($ydata);
                $lineplot2 = new LinePlot($ydata2);
                $lineplot3 = new LinePlot($ydata3);
        
            
                // Задаём цвет кривой
                $lineplot->SetColor('forestgreen');
                $lineplot2->SetColor('orange');
                $lineplot3->SetColor('red');
        
                // Присоединяем кривую к графику:
                $graph->Add($lineplot);
                //$graph->Add($lineplot2);
                //$graph->Add($lineplot3);
          
                // Даем графику имя:
                $graph->title->Set('ГРАФИК');

                // Назовем оси:
                $graph->xaxis->title->Set('time');
          
          
                // Выделим оси цветом:
                $graph->xaxis->SetColor('#СС0000');
                $graph->yaxis->SetColor('#СС0000');
          
                // Зададим толщину кривой:
                $lineplot->SetWeight(3);
          
          
                // Фон графика зальем градиентом:
                $graph->SetBackgroundGradient('ivory', 'orange');
          
                // Придадим графику тень:
                $graph->SetShadow(4);
          
                $graph->Stroke();
?>
 

WMix

герр M:)ller
Партнер клуба
а че не работает теперь?
PHP:
// Присоединяем кривую к графику:
                $graph->Add($lineplot);
                //$graph->Add($lineplot2);
                //$graph->Add($lineplot3);
 

Saratov64

Новичок
а че не работает теперь?
PHP:
// Присоединяем кривую к графику:
                $graph->Add($lineplot);
                //$graph->Add($lineplot2);
                //$graph->Add($lineplot3);
с одной переменной, отображает
правильно
закомнечено, чтобы отобразить хотя бы один параметр. И он работает, НО только один, снять комент со всех, или хотя бы одной переменной, и уже работает белебердой....
но у меня еще подозрение на НЕ понимание как отображается ось X, ее то у меня совсем нет ....
в идеале ось X это у меня время ... за которое надо отображать данные
 

Saratov64

Новичок
а че не работает теперь?
Еще я заметил, что по оси Х у меня выводит $graph->xgrid->Show(); количество записей в массиве, я так понял автоматом это происходит нужно задавать xgrid видимо... мне надо отобразить за 4 часа показания запись идет раз в минуту, 240 записей
 

Saratov64

Новичок
а че не работает теперь?
PHP:
// Присоединяем кривую к графику:
                $graph->Add($lineplot);
                //$graph->Add($lineplot2);
                //$graph->Add($lineplot3);
Я кажется нашел зацепку.
сделал сделал искуственный массив где, большая разница в каждом параметре, РАСХОД 1000 тысячи, Давление 3.5 - 4 атмосфер, буквально десятые доли отличие, и Темература от 3 до 5 градусов.
Получается на одном графике невозможно отобразить все три параметра, нужно для каждого параметра $ydata[] писать свою ОСЬ Y, Либо делать три графика отдельных, или для каждой ОСИ писать свой min max и на каждую ось свое отображать ??? хотя я не знаю возможностей JpGraph.
Если я нашел правильный след, до подправьте, пожалуйста мой код, я все таки ощущаю, что надо min max для каждой линии ...
 

WMix

герр M:)ller
Партнер клуба
хотя я не знаю возможностей JpGraph.
ну причти тогда
http://jpgraph.net/download/manuals/chunkhtml/index.html
вон даже пример твой
http://jpgraph.net/features/src/show-example.php?target=new_line1.php

РАСХОД 1000 тысячи, Давление 3.5 - 4 атмосфер, буквально десятые доли отличие, и Темература от 3 до 5 градусов.
я понятия не имею что ты делаешь, давление, состояние счета, количество мышек которых проглотил удав не имеет значения все это цифры.

приведи еще в базе к близким по величине параметрам разделив к примеру на 1000 "РАСХОД." и нарисуй несколько шкал
http://jpgraph.net/download/manuals/chunkhtml/ch14s06.html
 

Saratov64

Новичок
ну причти тогда
http://jpgraph.net/download/manuals/chunkhtml/index.html
вон даже пример твой
http://jpgraph.net/features/src/show-example.php?target=new_line1.php


я понятия не имею что ты делаешь, давление, состояние счета, количество мышек которых проглотил удав не имеет значения все это цифры.

приведи еще в базе к близким по величине параметрам разделив к примеру на 1000 "РАСХОД." и нарисуй несколько шкал
http://jpgraph.net/download/manuals/chunkhtml/ch14s06.html
хорошо, спасибо, что помогает, прочту....

привел к макс и мин .
PHP:
$ydata_max = max($ydata);
 $ydata_min = min ($ydata);
              
 $ydata2_max = max($ydata2);
 $ydata2_min = min ($ydata2);
              
$ydata3_max = max($ydata3);
$ydata3_min = min ($ydata3);
 

AnrDaemon

Продвинутый новичок
чувствую это надо делать ... Судя по вашему
вопросу
Умный мальчик…
Чтобы совместить на одной координатной плоскости три графика, надо сделать так, чтобы база и дельта всех графиков отличались минимально.
Если один график у тебя будет 0..3 а второй 50'000..70'000, ты увидишь только второй, а первый совпадёт с координатной осью.
Так что вспоминай математику и строй запрос так, чтобы он сразу отдавал адекватные данные. SQL это умеет.
 

Saratov64

Новичок
Умный мальчик…
Чтобы совместить на одной координатной плоскости три графика, надо сделать так, чтобы база и дельта всех графиков отличались минимально.
Если один график у тебя будет 0..3 а второй 50'000..70'000, ты увидишь только второй, а первый совпадёт с координатной осью.
Так что вспоминай математику и строй запрос так, чтобы он сразу отдавал адекватные данные. SQL это умеет.
Наверное дополнительные оси координат по Y три графика в одном, мыслей пока нет
 

AnrDaemon

Продвинутый новичок
Если есть возможность рисовать графики на разных плоскостях, совместив их - это будет самым простым выходом.
 

Saratov64

Новичок
Если есть возможность рисовать графики на разных плоскостях, совместив их - это будет самым простым выходом.
Я нашел выход: по этой ссылке, если кому-то понадобиться, http://jpgraph.net/doc/howto4.php

Multiple Y axes
Adding more Y-axis to a Graph


Но борюсь, с выводом уже на свой вэб.
Протестил данный файлик на прямую в html
HTML:
<img src="graph_sg.php">
все работает !!!
А при выводе через js кракозябры.....
Код:
<script>
$(document).ready(function(){        
 
 $("body").on('click','.test',function () {
     $("#main").load('graph/graph_sg.php');

         });
   });
</script>

<a href="#"  class="test" >ТЕСТ</a>
выдает ￿PNG IHDR￿￿￿ IDATx￿￿pw￿/￿￿￿ $￿￿￿￿￿'31d￿Y￿-￿qHe￿f7￿￿,y￿￿￿s*￿￿g￿￿￿......... ну и т.д.
я так понял, это что-то с передачей изображения

 

WMix

герр M:)ller
Партнер клуба
PHP:
 $("body").on('click','.test',function () {
     $("#main").html('<img src="graph_sg.php">');
   });
 
Сверху