Permalänk
Medlem

PHP skapa line plot samt tabell.

Hejsan!

Jag är ny inom programeringsområdet och jag skulle behöva hjälp med ett problem som jag har kört fast vid.

Det jag försöker göra är att skapa en databas med tre olika värden, denna datan vill jag sedan publicera på php en sida med en graf samt en tabell över det senaste dygnets data. För tillfället kör jag ett python script som läser av "serial data" från en arduino, denna datan matas sedan in i en SQLite databas. Jag har fått detta steget att fungera okej men jag har problem med php biten.

PHP scriptet jag har just nu ser ut på följande sett och det fungerar i den bemärkningen att all data visas på php sidan. Dock så är detta extremt opraktiskt och fult.

Jag hittade ett färdigt förslag på hur grafen skulle kunna se ut: Graf

Är det någon som har någon idé på hur jag ska attackera detta problemet?

PHP koden som jag kör just nu:

<?php class MyDB extends SQLite3 { function __construct() { $this->open('solartracker.db'); } } $db = new MyDB(); if(!$db){ echo $db->lastErrorMsg(); } else { echo "Opened database successfully\n"; } $sql =<<<EOF SELECT * from stuffToPlot; EOF; $ret = $db->query($sql); while($row = $ret->fetchArray(SQLITE3_ASSOC) ){ echo "Voltage = ". $row['voltage'] . "\n"; echo "\n"; echo "Current = ". $row['current'] ."\n"; echo "\n"; echo "Date = ". $row['datestamp'] ."\n"; } echo "Operation done successfully\n"; $db->close(); ?> ?>

Permalänk
Medlem
Skrivet av SaltyLiquorice:

Hejsan!

Jag är ny inom programeringsområdet och jag skulle behöva hjälp med ett problem som jag har kört fast vid.

Det jag försöker göra är att skapa en databas med tre olika värden, denna datan vill jag sedan publicera på php en sida med en graf samt en tabell över det senaste dygnets data. För tillfället kör jag ett python script som läser av "serial data" från en arduino, denna datan matas sedan in i en SQLite databas. Jag har fått detta steget att fungera okej men jag har problem med php biten.

PHP scriptet jag har just nu ser ut på följande sett och det fungerar i den bemärkningen att all data visas på php sidan. Dock så är detta extremt opraktiskt och fult.

Jag hittade ett färdigt förslag på hur grafen skulle kunna se ut: Graf

Är det någon som har någon idé på hur jag ska attackera detta problemet?

PHP koden som jag kör just nu:

<?php class MyDB extends SQLite3 { function __construct() { $this->open('solartracker.db'); } } $db = new MyDB(); if(!$db){ echo $db->lastErrorMsg(); } else { echo "Opened database successfully\n"; } $sql =<<<EOF SELECT * from stuffToPlot; EOF; $ret = $db->query($sql); while($row = $ret->fetchArray(SQLITE3_ASSOC) ){ echo "Voltage = ". $row['voltage'] . "\n"; echo "\n"; echo "Current = ". $row['current'] ."\n"; echo "\n"; echo "Date = ". $row['datestamp'] ."\n"; } echo "Operation done successfully\n"; $db->close(); ?> ?>

Tips är att använda [ code] taggarna så blir det lättare att läsa för alla
Återkommer på problemet senare

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Medlem

Hej, lite input. Är inte mycket inläst men ändå.

Skrivet av SaltyLiquorice:

<?php
class MyDB extends SQLite3
{
function __construct()
{
$this->open('solartracker.db');
}
}
$db = new MyDB();
if(!$db){
echo $db->lastErrorMsg();
} else {
echo "Opened database successfully\n";
}

$sql =<<<EOF
SELECT * from stuffToPlot;
EOF;

Här nedanför loopar du och skriver ut data. Dessa ska ju dock inte skrivas ut, de ska ju läggas i arrayer enligt principen från kodexemplet du länkar till. D.v.s. enligt

$datay1 = array(20,15,23,15);

Då får du ju åtminstone börja med att lägga in datat i arrayer.

Självklart ska du använda dessa arrayer då du skapar LinePlot klasser, enligt:
$p1 = new LinePlot($datay1);

Sedan antar jag att du vill ha datumen i "fälten" under grafen. Då får du lägga in alla dessa i en separat datumarray, den sätts enligt exemplet liknande detta:

$graph->xaxis->SetTickLabels(array('2016-02-01','2016-02-02','2016-02-03'));

Dock ska du ju bygga en array först med datumen för att sedan skicka in i metoden SetTickLabels. M.a.o. inte "hårdkodat" som i mitt exempel.

Permalänk
Medlem
Skrivet av Nollan:

Tips är att använda [ code] taggarna så blir det lättare att läsa för alla
Återkommer på problemet senare

Hur hittar jag dessa taggar? Fanns ingen i menyn där man kan länka bilder osv.

Skrivet av dannesthlm:

Hej, lite input. Är inte mycket inläst men ändå.

Här nedanför loopar du och skriver ut data. Dessa ska ju dock inte skrivas ut, de ska ju läggas i arrayer enligt principen från kodexemplet du länkar till. D.v.s. enligt

$datay1 = array(20,15,23,15);

Då får du ju åtminstone börja med att lägga in datat i arrayer.

Självklart ska du använda dessa arrayer då du skapar LinePlot klasser, enligt:
$p1 = new LinePlot($datay1);

Sedan antar jag att du vill ha datumen i "fälten" under grafen. Då får du lägga in alla dessa i en separat datumarray, den sätts enligt exemplet liknande detta:

$graph->xaxis->SetTickLabels(array('2016-02-01','2016-02-02','2016-02-03'));

Dock ska du ju bygga en array först med datumen för att sedan skicka in i metoden SetTickLabels. M.a.o. inte "hårdkodat" som i mitt exempel.

Nu är jag total amatör på php, koden jag använder just nu har jag hittat på nätet. Är mer familjär med python än vad jag är med php.
Hur skulle jag lägga upp dessa värden i en array? Har googlat ett tag nu men kommer inte fram till något vettigt. Blir inte riktigt klok på vad jag ska göra.

Oavsett är jag tacksam för er vägledning!

Permalänk
Medlem
Skrivet av SaltyLiquorice:

Hur hittar jag dessa taggar? Fanns ingen i menyn där man kan länka bilder osv.

Nu är jag total amatör på php, koden jag använder just nu har jag hittat på nätet. Är mer familjär med python än vad jag är med php.
Hur skulle jag lägga upp dessa värden i en array? Har googlat ett tag nu men kommer inte fram till något vettigt. Blir inte riktigt klok på vad jag ska göra.

Oavsett är jag tacksam för er vägledning!

Jag vet inte ifall de har någon hjälp där man kan hitta alla taggar osv. Men annars skriver du helt enkelt [ code] före din kod och [ /code] efter din kod (Dessa ska vara utan space emellan [ code )

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Medlem
Skrivet av SaltyLiquorice:

Hur hittar jag dessa taggar? Fanns ingen i menyn där man kan länka bilder osv.

Nu är jag total amatör på php, koden jag använder just nu har jag hittat på nätet. Är mer familjär med python än vad jag är med php.
Hur skulle jag lägga upp dessa värden i en array? Har googlat ett tag nu men kommer inte fram till något vettigt. Blir inte riktigt klok på vad jag ska göra.

Oavsett är jag tacksam för er vägledning!

Eftersom du skriver över datan i när du läser filen varje gång så behöver du lagra den någonstans.
Te.x:

$voltage = array(); while($row.....) { array_push($voltage, $row['voltage']); }

Efter du har lagrat all data kan du hantera den -> lägga ut den i en graf.

Permalänk
Medlem
Skrivet av Nollan:

Jag vet inte ifall de har någon hjälp där man kan hitta alla taggar osv. Men annars skriver du helt enkelt [ code] före din kod och [ /code] efter din kod (Dessa ska vara utan space emellan [ code )

Ska prova detta! Tack

Skrivet av noyce:

Eftersom du skriver över datan i när du läser filen varje gång så behöver du lagra den någonstans.
Te.x:

$voltage = array(); while($row.....) { array_push($voltage, $row['voltage']); }

Efter du har lagrat all data kan du hantera den -> lägga ut den i en graf.

Jag har kommit en bit på vägen men fastnar ändå på felet: PHP Fatal error: Call to a member function fetchArray() on null in /db1.php on line 24

GNU nano 2.2.6 File: db1.php $db = new MyDB(); if(!$db){ echo $db->lastErrorMsg(); } else { echo "Opened database successfully\n"; } $sql =<<<EOF SELECT * from stuffToPlot: EOF; $voltage = array($db->query[$sql]); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); } $graph = new Graph(300,250); $graph->SetScale("textlin"); $theme_class=new UniversalTheme; $graph->SetTheme($theme_class); $graph->img->SetAntiAliasing(false); $graph->title->Set('Filled Y-grid'); $graph->SetBox(false); $graph->img->SetAntiAliasing(); $graph->yaxis->HideZeroLabel(); $graph->yaxis->HideLine(false); $graph->yaxis->HideTicks(false,false); $graph->xgrid->Show(); $graph->xgrid->SetLineStyle("solid"); $graph->xaxis->SetTickLabels(array('A','B','C','D')); $graph->xgrid->SetColor('#E3E3E3'); $p1 = new LinePlot($voltage); $graph->Add($p1); $p1->SetColor("#6495ED"); $p1->SetLegend('Line 1'); ?> ?>

Permalänk
Medlem
Skrivet av SaltyLiquorice:

$voltage = array($db->query[$sql]); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); }

Om du jämför denna bit med det du hade i första inlägget så ser du nog var felet ligger.
$voltage ska inte vara samma sak som $ret, nu försöker du hämta rader från någonting som inte finns. ($row = $ret->fetch...).

$voltage = array(); $ret = $db->query[$sql] while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); }

Permalänk
Medlem
Skrivet av noyce:

Om du jämför denna bit med det du hade i första inlägget så ser du nog var felet ligger.
$voltage ska inte vara samma sak som $ret, nu försöker du hämta rader från någonting som inte finns. ($row = $ret->fetch...).

$voltage = array(); $ret = $db->query[$sql] while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); }

Ledsen om jag är trög nu men jag förstår inte riktigt var problemet ligger.

$yAxis = array(); $ret = $db->query[$sql]; while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); }

Jag får fortfarande felkoder:
PHP Notice: Undefined property: MyDB::$query in /var/www/html/db1.php on line 24
PHP Fatal error: Call to a member function fetchArray() on null in /var/www/html/db1.php on line 25

Tack för att ni hjälper mig med detta!

Permalänk
Medlem
Skrivet av SaltyLiquorice:

Ledsen om jag är trög nu men jag förstår inte riktigt var problemet ligger.

$yAxis = array(); $ret = $db->query[$sql]; while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); }

Jag får fortfarande felkoder:
PHP Notice: Undefined property: MyDB::$query in /var/www/html/db1.php on line 24
PHP Fatal error: Call to a member function fetchArray() on null in /var/www/html/db1.php on line 25

Tack för att ni hjälper mig med detta!

Jag kollade inte riktigt igenom din kod helt förra gången,
Men som din felkod säger så är det något fel när du försöker anropa $db->query.
Felet är antagligen att det är "[]" istället för "()".
Sen har du döpt om $voltage till $yAxis, ändra det inne i whileloopen då också!

$yAxis = array(); $ret = $db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($yAxis, row['voltage']); }

Permalänk
Medlem
Skrivet av noyce:

Jag kollade inte riktigt igenom din kod helt förra gången,
Men som din felkod säger så är det något fel när du försöker anropa $db->query.
Felet är antagligen att det är "[]" istället för "()".
Sen har du döpt om $voltage till $yAxis, ändra det inne i whileloopen då också!

$yAxis = array(); $ret = $db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($yAxis, row['voltage']); }

Nu fick jag istället en ny felkod dock verkade det som att hakparantesen var problemet med den tidigare koden.
Nya felkoden är:

PHP Warning: Illegal string offset 'voltage' in /var/www/html/db1.php on line 26

Har detta problem något att göra med att datan i databasen är fel formaterad? Eller är det så att problemet ligger i scriptet?

$yAxis = array(); $ret = $db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($yAxis, row['voltage']);

Permalänk
Medlem
Skrivet av SaltyLiquorice:

Nu fick jag istället en ny felkod dock verkade det som att hakparantesen var problemet med den tidigare koden.
Nya felkoden är:

PHP Warning: Illegal string offset 'voltage' in /var/www/html/db1.php on line 26

Har detta problem något att göra med att datan i databasen är fel formaterad? Eller är det så att problemet ligger i scriptet?

$yAxis = array(); $ret = $db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($yAxis, row['voltage']);

Man skulle kanske kunna tänka sig att det är datan det är fel på, men om du inte har ändrat något så borde det inte vara fallet.
Det ser däremot ut som dollartecknet har smitit iväg innan row i array_push. Om du får en felkod, kolla på raden där felet är och försök klura ut vad det kan vara.
Du kan ju alltid göra en kopia och sedan exprementera och försöka lösa problemet!

Permalänk
Medlem
Skrivet av noyce:

Man skulle kanske kunna tänka sig att det är datan det är fel på, men om du inte har ändrat något så borde det inte vara fallet.
Det ser däremot ut som dollartecknet har smitit iväg innan row i array_push. Om du får en felkod, kolla på raden där felet är och försök klura ut vad det kan vara.
Du kan ju alltid göra en kopia och sedan exprementera och försöka lösa problemet!

Får pröva detta!

När jag lägger läser av datan från min arduino så sparar jag den som en string spelar detta någon roll för php eller tar databasen hand om att värdet möjligtvis är felformaterat? När jag sparar datan i databasen använder jag mig av funktionen "REAL" för voltage och current raden.

Om jag slänger in $ vid row så skrivs det 600 rader med illegal string offset 'voltage' i logen.

Ska prova det du föreslog samt radera värdena i databasen och börja om på nytt där och se om det hjälper.

/J

Permalänk
Medlem
Skrivet av SaltyLiquorice:

Får pröva detta!

När jag lägger läser av datan från min arduino så sparar jag den som en string spelar detta någon roll för php eller tar databasen hand om att värdet möjligtvis är felformaterat? När jag sparar datan i databasen använder jag mig av funktionen "REAL" för voltage och current raden.

Om jag slänger in $ vid row så skrivs det 600 rader med illegal string offset 'voltage' i logen.

Ska prova det du föreslog samt radera värdena i databasen och börja om på nytt där och se om det hjälper.

/J

Helt klart försöker du göra något galet, troligtvis något syntax fel vid $row['voltage']. För att enklast felsöka saker som detta tycker jag att det lättaste för att se vad $row faktiskt innehåller är att köra en var_dump($row);.

Permalänk
Medlem

Kan nog inte hjälpa dig med programmeringen tyvärr, men är väldigt nyfiken vad du pysslar med för projekt.

Jag har gjort ett liknande projekt som plottar effekt och energi som du kan se här: http://www.sweclockers.com/galleri/9123-elmatar-plotting

Permalänk

"Illegal string offset" - brukar betyda att nämnda variabel inte är en array, i det här fallet är $voltage inte en array.

Sen försöker jag förstå den här biten:

$sql =<<<EOF SELECT * from stuffToPlot: EOF; $voltage = array($db->query[$sql]); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); }

Varför stoppar du in SQL-förfrågan i $voltage-arrayen? array_push fyller på befintlig array med värden så $voltage[0] i det här fallet är "SELECT * from stuffToPlot" som jag ser det.

$voltage = array($db->query[$sql]);

Jag hade nog gjort något i den här stilen:

$sql =<<<EOF SELECT * from stuffToPlot: EOF; $voltage = array(); $ret = $db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { $voltage[] = row['voltage']); }

Permalänk
Medlem
Skrivet av noyce:

Helt klart försöker du göra något galet, troligtvis något syntax fel vid $row['voltage']. För att enklast felsöka saker som detta tycker jag att det lättaste för att se vad $row faktiskt innehåller är att köra en var_dump($row);.

Ska pröva detta samt koden som Sqall Leonhart skrev. Tack för all hjälp so far!

Skrivet av Undie:

Kan nog inte hjälpa dig med programmeringen tyvärr, men är väldigt nyfiken vad du pysslar med för projekt.

Jag har gjort ett liknande projekt som plottar effekt och energi som du kan se här: http://www.sweclockers.com/galleri/9123-elmatar-plotting

Jag arbetar på mitt gymnasiearbete. Tanken är att jag ska ha en självjusterande solcell som följer solen under dagen. Det jag ska undersöka är hur mycket mer energi (procentuellt) man får ut under en dag med en roterande solcell i förhållande till en stationär. Tanken är att jag även ska försöka analysera kostnaden mellan en stationär och en roterande solcell, frågeställningen är ungefär: Hur mycket energi måste solcellen producera för att det ska bli lönsamt med ett roterande system.

Till min hjälp använder jag mig av två Arduino och en rpi 3. Raspberry pin använder jag som webserver och databas. Den ena Arduinon styr solcellen och den andra mäter energiproduktionen. Webbsidan är egentligen onödig för att svara på frågeställningen men jag la till den som en bonus för att lära mig ännu mer programering och för att "wow" faktorn ökar en aning.

Kan tänka mig att lägga upp både den färdiga rapporten och ett galleri på projektet när det är klart, dock lär detta dröja fram till våren någon gång då det är först då det ska vara inlämnat. Tills dess ska jag finslipa på alla detaljer och samla massa mätvärden

Här är en sketchup modell över vad jag ungefär försöker åstadkomma. Om du har någon idé för att förbättra projektet skulle jag självklart vara tacksam för detta!

Skrivet av Squall Leonhart:

"Illegal string offset" - brukar betyda att nämnda variabel inte är en array, i det här fallet är $voltage inte en array.

Sen försöker jag förstå den här biten:

$sql =<<<EOF SELECT * from stuffToPlot: EOF; $voltage = array($db->query[$sql]); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); }

Varför stoppar du in SQL-förfrågan i $voltage-arrayen? array_push fyller på befintlig array med värden så $voltage[0] i det här fallet är "SELECT * from stuffToPlot" som jag ser det.

$voltage = array($db->query[$sql]);

Jag hade nog gjort något i den här stilen:

$sql =<<<EOF SELECT * from stuffToPlot: EOF; $voltage = array(); $ret = $db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { $voltage[] = row['voltage']); }

Då förstår jag var problemet ligger, är som sagt total noob på php och sql. Ska provköra din kod under kvällen och se vad som händer.

Tack så mycket

Permalänk
Medlem
Skrivet av Squall Leonhart:

"Illegal string offset" - brukar betyda att nämnda variabel inte är en array, i det här fallet är $voltage inte en array.

Sen försöker jag förstå den här biten:

$sql =<<<EOF SELECT * from stuffToPlot: EOF; $voltage = array($db->query[$sql]); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { array_push($voltage, row['voltage']); }

Varför stoppar du in SQL-förfrågan i $voltage-arrayen? array_push fyller på befintlig array med värden så $voltage[0] i det här fallet är "SELECT * from stuffToPlot" som jag ser det.

$voltage = array($db->query[$sql]);

Jag hade nog gjort något i den här stilen:

$sql =<<<EOF SELECT * from stuffToPlot: EOF; $voltage = array(); $ret = $db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { $voltage[] = row['voltage']); }

Har provat din kod nu och fick syntax error vid: $voltage = row['voltage']);
Verkar som att felet låg i att det var en parantes för mycket, när jag tog bort denna så fick ännu en gång "illegal string offset".

Använder jag mig av fel fetcharray funktion? Ska det vara SQLITE3_NUM istället för _ASSOC?

Jag provade även att sluta hämta all data från databasen och bara spänningen. Detta verkade inte heller ha gjort någon skillnad.

$sql =<<<EOF SELECT voltage from stuffToPlot; EOF; $voltage = array(); $ret = $db->query($sql); while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { $voltage[] = row['voltage']; var_dump($row); }

När jag kör var_dump får jag upp detta: Bild

Permalänk

Jag är inte jätteinsatt i SQLite men om det funkar som MySQL så är SQLITE3_ASSOC rätt metod för ditt ändamål.

Prova att kör var_dump() efter loopen och på $voltage istället. Alltså:

while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { $voltage[] = row['voltage']; } var_dump($voltage);

Det BORDE se ut något liknande detta då:

array(X) { [0]=> float(4.02) [1]=> float(4.02) [2]=> float(4.01) .... }

(För att enklare läsa var_dump och andra liknande utskrifter kan du kolla källkoden till sidan (ctrl+u) istället så får du upp svaret som det är tänkt med radbrytningar och sådant)

Det ser ut som att 3 av dina första värden i databasen är mellanslag (string) enbart. Kanske ta bort dessa?
Alternativt kör med:

while ($row = $ret->fetchArray(SQLITE3_ASSOC)) { if(is_numeric(row['voltage'])) { $voltage[] = row['voltage']; } }