 |
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 12. 2011 17:46
vypisuji data takto:
<?
$spojeni=mysql_connect("localhost","jmeno","heslo");
$co="SELECT * FROM tab";
$navrat=mysql_db_query("db", $co, $spojeni);
for ($i=1;$i<mysql_num_fields($navrat); $i++);
while (list( $datum, $id ,$T1,) = mysql_fetch_row($navrat)){
echo(" $datum), $id, $T1 <br>");
}
?>
ale to mi vypíše celý sloupec.
Dá se nějak vypsat třeba jen posledníc 20 záznamů?
Nebo třeba od řádku x do řádku x+20.
díky
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 17:54
Na to se používá LIMIT. Bude nutné podle data udělat SORT DESC, vezmeš prvních 20 a znovu seřadíš, tentokrát vzestupně. Asi bude vhodné vytvořit k tabulce index podle zmíněného časového razítka.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 12. 2011 18:38
napadlo mě toto:
vypisovat data sestupně pomocí fce DESC
a fce LIMIT zobrazit 20 záznamů.
ale toto je asi špatně
$co="SELECT * FROM sds ORDER BY $T1 DESC LIMIT 20,";
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 19:27
Chybička se vloudila. Předpokládám, že timestamp je označen jako sloupec T1:
$co="SELECT * FROM sds ORDER BY T1 DESC LIMIT 20;";
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 20:06
Tak proč jsi to chtěl řadit podle teploty?
$co="SELECT * FROM sds ORDER BY datum DESC LIMIT 20;";
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 12. 2011 20:11
Kite, když už jsi na příjmu
poradíš mi s tímto?
Jak to do toho skriptu výpisu z db dosadit?
$fd=fopen('data.txt','a');
$data=date('r');
fwrite($fd,"$T1");
fclose($fd);
díky
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 20:19
Nerozumím dotazu. Do souboru data.txt zapisuješ (přidáváš na konec) hodnotu z proměnné $T1. Co chceš odkud kam zapsat? A k čemu máš proměnnou $data, když ji nikde nepoužíváš?
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 12. 2011 20:26
do toho původního skriptu
<?
$spojeni=mysql_connect("localhost","jmeno","heslo");
$co="SELECT * FROM tab";
$navrat=mysql_db_query("db", $co, $spojeni);
for ($i=1;$i<mysql_num_fields($navrat); $i++);
while (list( $datum, $id ,$T1,) = mysql_fetch_row($navrat)){
echo(" $datum), $id, $T1 <br>");
}
?>
nechci tam mít to
echo(" $datum), $id, $T1 <br>");
ale napasovat tam to zapisování do souboru data.txt
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 12. 2011 20:32
<?
$spojeni=mysql_connect("localhost","jmeno","heslo");
$co="SELECT * FROM tab";
$navrat=mysql_db_query("db", $co, $spojeni);
for ($i=1;$i<mysql_num_fields($navrat); $i++);
while (list( $datum, $id ,$T1,) = mysql_fetch_row($navrat)){
//echo(" $datum), $id, $T1 <br>");
$fd=fopen('data.txt','a');
$data=date('r');
fwrite($fd,"$datum), $id, $T1 <br>");
fclose($fd);
}
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 20:39
<?
$spojeni=mysql_connect("localhost","jmeno","heslo");
$co="SELECT datum,id,T1 FROM tab";
$navrat=mysql_db_query("db", $co, $spojeni);
$fd=fopen('data.txt','a');
for ($i=1;$i<mysql_num_fields($navrat); $i++);
while (list( $datum, $id ,$T1) = mysql_fetch_row($navrat)){
fwrite($fd,"$datum), $id, $T1 <br>");
}
fclose($fd);
?>
Jenom mi stále není jasné, k čemu ti to bude. Postrádá to logiku.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 12. 2011 21:00
http://www.highcharts.com/demo/line-labels
u grafu máš view options.
Místo hodnot které jsou psané přímo, dávám hodnoty z databáze. Ale ten skript který vyčítá z databáze tam nejde dát přímo.
funguje mi toto
[<?php echo file_get_contents('teplota.php'); ?>]
v souboru teplota.php mám ten předchozí skript.
Ale chci mít v jednom souboru skript který bude posílat do více souborů.
uff
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 21:14
Ten skript, který to vyčítá z databáze, tam zcela jistě jde dát přímo. Napiš strukturu, kterou highcharts očekává a dáme to dohromady. Možná tam jen chybí správná hlavička MIME.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 12. 2011 21:22
očekává toto:
series: [{
name: 'Tokyo',
data: [7.0, 6.9, 9.5, 14.5, 18.4, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
}, {
name: 'London',
data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
}]
a já mám toto:
series: [{
name: 'Teplota1',
data: [<?php echo file_get_contents('teplota1.php'); ?>]
}, {
name: 'Teplota2',
data: [<?php echo file_get_contents('teplota2.php'); ?>]
}]
nevím proč, ale tohle mi tam nejde
<?
$spojeni=mysql_connect("localhost","jmeno","heslo");
$co="SELECT * FROM tab";
$navrat=mysql_db_query("db", $co, $spojeni);
for ($i=1;$i<mysql_num_fields($navrat); $i++);
while (list( $T1,) = mysql_fetch_row($navrat)){
echo(" $T1 <br>");
}
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 21:26
Protože mu cpeš skript místo dat. Funkce file_get_contents() zkopíruje skript, ale neprovede ho.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 21:35
Nejprimitivnější metodou by mohlo být prosté nahrazení funkce file_get_contents() funkcí include(). Je však zbytečné databázi otvírat 2x (velká režie), takže další úpravy budou víc než vhodné.
Dá se to s přehledem nacpat do jednoho skriptu.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 21:53
Určitě to jde napsat lépe, střílím od pasu:
<?
$spojeni=mysql_connect("localhost","jmeno","heslo");
$co="SELECT T1,T2 FROM tab ORDER BY datum DESC LIMIT 20;";
$navrat=mysql_db_query("db", $co, $spojeni);
while (list( $T1,$T2) = mysql_fetch_row($navrat)){
$teploty1[]=$T1;
$teploty2[]=$T2;
}
$T1=implode(',',array_reverse($teploty1));
$T2=implode(',',array_reverse($teploty2));
echo <<<EOT
series: [{
name: 'Teplota1',
data: [$T1]
}, {
name: 'Teplota2',
data: [$T2]
}]
EOT;
?>
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 14. 12. 2011 23:04
takto vypisuji z databáze datum:
<?
$spojeni=mysql_connect("localhost","jmeno","heslo");
$co="SELECT datum FROM data_1 ORDER BY datum DESC LIMIT 20;";
$navrat=mysql_db_query("energie", $co, $spojeni);
while (list( $datum) = mysql_fetch_row($navrat)){
$datum1[]=$datum;
}
$datum1=implode("','",array_reverse($datum1));
echo <<<EOT
xAxis: {
categories: ['$datum1'],
},
EOT;
?>
vypíše se mi v tomto formátu: 2011-12-14 19:42:06
jde udělat aby se vypsal třeba jen rok, měsíc, nebo hodina a minuta?
díky
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 14. 12. 2011 23:39
Jistě. Mrkni se na
http://www.tutorialspoint.com/mysql/mysql-date-time-functions.htm#function_date-format
Rozhodně je fajnovější, když to uděláš přímo v databázi, než to nechat šmudlit pomalými skripty v PHP.
BTW: Proč to nevypisuješ takto?
$co="SELECT datum,T1,T2 FROM tab ORDER BY datum DESC LIMIT 20;";
Přece máš tu trojici v databázi pohromadě, tak bys s tím měl i zacházet. Místo sloupce datum samozřejmě použij požadovanou funkci, ale ORDER BY neměň (pokud nechceš řadit podle něčeho jiného). Jeden SELECT by ti měl stačit na všechna požadovaná data z DB.
A chybí ti tam definice prázdného pole na začátku skriptu, tedy
$datum1=array();
Nějak jsem to přehlédl. Divím se, že to funguje. To je hrozné, co PHP snese.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 15. 12. 2011 16:26
mám někde chybu ve "vyčítání z XML souboru do databáze?
Do databáze to sice zapisuje, ale nulu.
<?php
$server = "localhost"; // adresa MySQL serveru
$database = "xxxx"; // prihlasovaci jmeno do databaze
$heslo = "xxxx"; // prihlasovaci heslo do databaze
$dbname = "xxxx"; //nazev databaze
$link = mysql_connect("$server", "$database", "$heslo") or die ("Nepovedlo se spojit s databazi.");
$db = mysql_select_db("$dbname", $link) or die("Nepovedlo se otevrit databazi.");
$raw_udaje["penize"] = htmlspecialchars($_GET['penize'], ENT_QUOTES, "UTF-8");
$obsah=file_get_contents("http://109.80.22.31/xml.xml");
$xml = new SimpleXMLElement($obsah);
$penize = $xml->xpath('/sds/snmp/s0_2/money');
mysql_query("INSERT INTO sds (penize)
values
('".$raw_udaje["penize"]."');") or die('Mas tam chybu : '.mysql_error());
?>
Vidím to na chybu v tom čtení z XML, ale nevím kde.
Někde chybí toto asi tohle : $penize[0]
Prosím o radu, díky.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 16. 12. 2011 16:20
tak jsem spáchal tohle:
Sice to odešle, ale v databázi jsou opšt samé nuly.
<?
// vycitani dat ze souboru XML
$xml = simplexml_load_file('http:// IP /xml.xml');
$plyn_imp = $xml->snmp->s0_0->imdiff;
$plyn_celkem_dole = $xml->snmp->s0_0->text;
$plyn_cena = $xml->snmp->s0_0->money;
$plyn_aktual = $xml->snmp->s0_0->act;
$elektrika_imp = $xml->snmp->s0_2->imdiff;
$elektrika_celkem = $xml->snmp->s0_2->text;
$elektrika_cena = $xml->snmp->s0_2->money;
$elektrika_aktual = $xml->snmp->s0_2->act;
$voda_imp = $xml->snmp->s0_1->imdiff;
$voda_celkem = $xml->snmp->s0_1->text;
$voda_cena = $xml->snmp->s0_1->money;
$voda_aktual = $xml->snmp->s0_1->act;
// pripojeni k databazi
$server = "localhost"; // adresa MySQL serveru
$database = "xxxx"; // prihlasovaci jmeno do db
$heslo = "xxxx"; // heslo
$dbname = "xxxx"; //nazev db
$link = mysql_connect("$server", "$database", "$heslo") or die ("Nepovedlo se spojit s databázĂ.");
$db = mysql_select_db("$dbname", $link) or die("Nepovedlo se otevĹ™Ăt databázi.");
$raw_udaje["plyn_imp"] = htmlspecialchars($_GET['plyn_imp'], ENT_QUOTES, "UTF-8");
$raw_udaje["plyn_celkem"] = htmlspecialchars($_GET['plyn_celkem'], ENT_QUOTES, "UTF-8");
$raw_udaje["plyn_cena"] = htmlspecialchars($_GET['plyn_cena'], ENT_QUOTES, "UTF-8");
$raw_udaje["plyn_aktual"] = htmlspecialchars($_GET['plyn_aktual'], ENT_QUOTES, "UTF-8");
$raw_udaje["elektrika_imp"] = htmlspecialchars($_GET['elektrika_imp'], ENT_QUOTES, "UTF-8");
$raw_udaje["elektrika_celkem"] = htmlspecialchars($_GET['elektrika_celkem'], ENT_QUOTES, "UTF-8");
$raw_udaje["elektrika_cena"] = htmlspecialchars($_GET['elektrika_cena'], ENT_QUOTES, "UTF-8");
$raw_udaje["elektrika_aktual"] = htmlspecialchars($_GET['elektrika_aktual'], ENT_QUOTES, "UTF-8");
$raw_udaje["voda_imp"] = htmlspecialchars($_GET['voda_imp'], ENT_QUOTES, "UTF-8");
$raw_udaje["voda_celkem"] = htmlspecialchars($_GET['voda_celkem'], ENT_QUOTES, "UTF-8");
$raw_udaje["voda_cena"] = htmlspecialchars($_GET['voda_cena'], ENT_QUOTES, "UTF-8");
$raw_udaje["voda_aktual"] = htmlspecialchars($_GET['voda_aktual'], ENT_QUOTES, "UTF-8");
mysql_query("INSERT INTO xxx
(plyn_imp, plyn_celkem, plyn_cena, plyn_aktual,
elektrika_imp, elektrika_celkem, elektrika_cena, elektrika_aktual,
voda_imp, voda_celkem, voda_cena, voda_aktual)
VALUES
('".$raw_udaje["plyn_imp"]."'
,'".$raw_udaje["plyn_celkem"]."'
,'".$raw_udaje["plyn_cena"]."'
,'".$raw_udaje["plyn_aktual"]."'
,'".$raw_udaje["elektrika_imp"]."'
,'".$raw_udaje["elektrika_celkem"]."'
,'".$raw_udaje["elektrika_cena"]."'
,'".$raw_udaje["elektrika_aktual"]."'
,'".$raw_udaje["voda_imp"]."'
,'".$raw_udaje["voda_celkem"]."'
,'".$raw_udaje["voda_cena"]."'
,'".$raw_udaje["voda_aktual"]."');") or die('Chyba: '.mysql_error());
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 12. 2011 16:26
A proč tam nedáváš hodnoty proměnných $plyn_imp, $plyn_celkem_dole, ... ? Když už to doluješ z XML, tak bys to možná mohl i použít.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 16. 12. 2011 16:37
jojo, zapomnel jsem
mysql_query("INSERT INTO sds
($plyn_imp , $plyn_celkem, $plyn_cena, $plyn_aktual,
$elektrika_imp, $elektrika_celkem, $elektrika_cena, $elektrika_aktual,
$voda_imp, $voda_celkem, $voda_cena, $voda_aktual)
ted to pise toto:
Chyba: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '385416142 , , 9301.60 , 0.0 , 44991, 1398.910 , 6019.56 , 0.800 , ' at line 3
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 12. 2011 16:49
V některé z těch proměnných máš prázdný řetězec. To ošetříš tak, že když je vytváříš
$plyn_celkem_dole = $xml->snmp->s0_0->text;
tak to nahradíš například takto:
$plyn_celkem_dole = $xml->snmp->s0_0->text*1;
Tím se to převede na číslo, i kdyby tam byl řetězec.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 12. 2011 17:07
Ale je. Definuješ proměnnou
$plyn_celkem_dole= $xml->snmp->s0_0->text;
a používáš nedefinovanou proměnnou
$plyn_celkem
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 16. 12. 2011 17:41
$xml = simplexml_load_file('http:// IP /xml.xml');
$plyn_imp = $xml->snmp->s0_0->imdiff*1;
$plyn_celkem = $xml->snmp->s0_0->text*1;
$plyn_cena = $xml->snmp->s0_0->money*1;
$plyn_aktual = $xml->snmp->s0_0->act*1;
$elektrika_imp = $xml->snmp->s0_2->imdiff*1;
$elektrika_celkem = $xml->snmp->s0_2->text*1;
$elektrika_cena = $xml->snmp->s0_2->money*1;
$elektrika_aktual = $xml->snmp->s0_2->act*1;
$voda_imp = $xml->snmp->s0_1->imdiff*1;
$voda_celkem = $xml->snmp->s0_1->text*1;
$voda_cena = $xml->snmp->s0_1->money*1;
$voda_aktual = $xml->snmp->s0_1->act*1;
$server = "localhost"; // adresa MySQL serveru
$database = "xxxx"; // prihlasovaci jmeno do db
$heslo = "xxxx"; // heslo
$dbname = "xxxx"; //nazev db
$link = mysql_connect("$server", "$database", "$heslo") or die ("Nepovedlo se spojit s databázĂ.");
$db = mysql_select_db("$dbname", $link) or die("Nepovedlo se otevĹ™Ăt databázi.");
$raw_udaje["plyn_imp"] = htmlspecialchars($_GET['plyn_imp'], ENT_QUOTES, "UTF-8");
$raw_udaje["plyn_celkem"] = htmlspecialchars($_GET['plyn_celkem'], ENT_QUOTES, "UTF-8");
$raw_udaje["plyn_cena"] = htmlspecialchars($_GET['plyn_cena'], ENT_QUOTES, "UTF-8");
$raw_udaje["plyn_aktual"] = htmlspecialchars($_GET['plyn_aktual'], ENT_QUOTES, "UTF-8");
//60
$raw_udaje["elektrika_imp"] = htmlspecialchars($_GET['elektrika_imp'], ENT_QUOTES, "UTF-8");
$raw_udaje["elektrika_celkem"] = htmlspecialchars($_GET['elektrika_celkem'], ENT_QUOTES, "UTF-8");
$raw_udaje["elektrika_cena"] = htmlspecialchars($_GET['elektrika_cena'], ENT_QUOTES, "UTF-8");
$raw_udaje["elektrika_aktual"] = htmlspecialchars($_GET['elektrika_aktual'], ENT_QUOTES, "UTF-8");
$raw_udaje["voda_imp"] = htmlspecialchars($_GET['voda_imp'], ENT_QUOTES, "UTF-8");
$raw_udaje["voda_celkem"] = htmlspecialchars($_GET['voda_celkem'], ENT_QUOTES, "UTF-8");
$raw_udaje["voda_cena"] = htmlspecialchars($_GET['voda_cena'], ENT_QUOTES, "UTF-8");
$raw_udaje["voda_aktual"] = htmlspecialchars($_GET['voda_aktual'], ENT_QUOTES, "UTF-8");
mysql_query("INSERT INTO sds
( $plyn_imp,$plyn_celkem,$plyn_cena,$plyn_aktual,
$elektrika_imp,$elektrika_celkem,$elektrika_cena,$elektrika_aktual,
$voda_imp,$voda_celkem,$voda_cena,$voda_aktual )
VALUES
('".$raw_udaje["plyn_imp"]."'
,'".$raw_udaje["plyn_celkem"]."'
,'".$raw_udaje["plyn_cena"]."'
,'".$raw_udaje["plyn_aktual"]."'
,'".$raw_udaje["elektrika_imp"]."'
,'".$raw_udaje["elektrika_celkem"]."'
,'".$raw_udaje["elektrika_cena"]."'
,'".$raw_udaje["elektrika_aktual"]."'
,'".$raw_udaje["voda_imp"]."'
,'".$raw_udaje["voda_celkem"]."'
,'".$raw_udaje["voda_cena"]."'
,'".$raw_udaje["voda_aktual"]."');") or die('Chyba: '.mysql_error());
?>
skript hodnoty zřejmě přečtě ale napošle do db a hlásí tuto chybu :
Chyba: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0,753,9301,0, 52398,1399,6025,0, 0,0,0,0 ) VALUES ' at line 3
ale nikde ji nevidím
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 16. 12. 2011 17:58
odstranil jsem "dolary" to bylo asi špatně. Posílá to, ale opět jen samé nuly.
mysql_query("INSERT INTO sds
( plyn_imp,plyn_celkem,plyn_cena,plyn_aktual,
elektrika_imp,elektrika_celkem,elektrika_cena,elektrika_aktual,
voda_imp,voda_celkem,voda_cena,voda_aktual )
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 16. 12. 2011 18:41
tak jiný skript, ten funguje.
Ale proč nefungoval ten predchozí?
$xml = simplexml_load_file('http:// IP/xml.xml');
$plyn_imp = $xml->snmp->s0_0->imdiff*1;
$plyn_celkem = $xml->snmp->s0_0->text*1;
$plyn_cena = $xml->snmp->s0_0->money*1;
$plyn_aktual = $xml->snmp->s0_0->act*1;
$elektrika_imp = $xml->snmp->s0_2->imdiff*1;
$elektrika_celkem = $xml->snmp->s0_2->text*1;
$elektrika_cena = $xml->snmp->s0_2->money*1;
$elektrika_aktual = $xml->snmp->s0_2->act*1;
$voda_imp = $xml->snmp->s0_1->imdiff*1;
$voda_celkem = $xml->snmp->s0_1->text*1;
$voda_cena = $xml->snmp->s0_1->money*1;
$voda_aktual = $xml->snmp->s0_1->act*1;
try {
$db = new PDO("mysql:host=localhost;dbname=dbname", "name", "passw");
$sql = $db->exec("INSERT INTO `tab`
(`plyn_imp`,`plyn_celkem`,`plyn_cena`,`plyn_aktual`,
`elektrika_imp`,`elektrika_celkem`,`elektrika_cena`,`elektrika_aktual`,
`voda_imp`,`voda_celkem`,`voda_cena`,`voda_aktual`)
VALUES
($plyn_imp,$plyn_celkem,$plyn_cena,$plyn_aktual,
$elektrika_imp,$elektrika_celkem,$elektrika_cena,$elektrika_aktual,
$voda_imp,$voda_celkem,$voda_cena,$voda_aktual)");
$db = null;
}
catch (PDOException $e) {
// obsluha pripadne chyby pri praci s databazi
echo "Pri praci s databazi doslo k chybe: " . $e->getMessage();
}
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 12. 2011 19:23
- Proč tam máš pole $_GET?
- K čemu je pole $raw_udaje?
- Proč místo seznamu proměnných dáváš do INSERTu seznam hodnot?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 12. 2011 19:59
$xml = simplexml_load_file('http:// IP /xml.xml');
$plyn_imp = $xml->snmp->s0_0->imdiff*1;
$plyn_celkem = $xml->snmp->s0_0->text*1;
$plyn_cena = $xml->snmp->s0_0->money*1;
$plyn_aktual = $xml->snmp->s0_0->act*1;
$link = mysql_connect("$server", "$database", "$heslo");
$db = mysql_select_db("$dbname", $link);
mysql_query("INSERT INTO sds
(plyn_imp, plyn_celkem, plyn_cena, plyn_aktual) values
($plyn_imp, $plyn_celkem, $plyn_cena, $plyn_aktual);");
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 12. 2011 20:45
Není zač. Ani mi to nedalo moc práce. Jen jsem vzal kusy tvého kódu a poskládal ve správném pořadí. Schválně jsem to nedělal celé, aby sis zbytek dodělal za domácí úkol :-)
A teď vážně: Aby se z příkladu neztratila přehlednost. Účelem poradny není vyřešit úkol, ale navést správným směrem.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 16. 12. 2011 21:02
všude na diskuzích jsem četl jak výpis z XML do db je složitý.
Skripty stořádkové a nebyl jsem, z nich nijak moudrý.
A ty to napíšeš na deset řádků. Príma.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 12. 2011 21:45
Jsem tím pověstný. Rád píšu jednořádkové programy tam, kde jiní plýtvají 50 řádky. Uvedený program by se dal ještě zkrátit, ale výsledek by nemusel být jednoduše pochopitelný.
Hodně lidí hledá v programování nějaké složitosti, ale většinou stačí využít sílu dostupného jazyka. Je důležité pochopit rozdílnost paradigmat v různých jazycích a vytěžit z nich maximum jejich kombinací. Výsledné programy pak dosahují podobného výkonu, jako by celá aplikace byla pracně napsána ve strojovém kódu.
Hodně mi pomohlo studium Lispu. Je v něm patrný tlak na čistotu programování, protože nežádoucí praktiky se tam dělají obtížněji než žádoucí.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 16. 12. 2011 23:00
Nedalo mi to a zkusil jsem si jednu z možných zkrácených verzí uvedeného programu:
$raw_udaje=array(
'plyn_imp' => $xml->snmp->s0_0->imdiff*1,
'plyn_celkem' => $xml->snmp->s0_0->text*1,
'plyn_cena' => $xml->snmp->s0_0->money*1,
'plyn_aktual' => $xml->snmp->s0_0->act*1);
$query="INSERT INTO sds (".implode(',',array_keys($raw_udaje)).") values (".implode(',',array_values($raw_udaje)).");";
Výhodou je, že pokud přidáš nějakou hodnotu do pole $raw_udaje, přidá se automaticky i do SQL dotazu. Funguje to však jen pro čísla, pro řetězce (nebo pro mix) bych to musel napsat jinak.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 19. 12. 2011 18:28
Kite,
prosím je ještě nějaký skript který mi vyčte z databáze třeba každý druhý, nebo třeba pátý záznam? Mám tu od Tebe jeden skript.
Tento vypisuje posledních 20 záznamů.
Vím, že se dá dosadit třeba DESC LIMIT 15,20
a čte to od 15tého řádku dvacet hodnot.
Ale nevím co použít na výpis který potřebuji.
Díky
<?
$spojeni=mysql_connect("localhost","jmeno","heslo");
$co="SELECT datum FROM data_1 ORDER BY datum DESC LIMIT 20;";
$navrat=mysql_db_query("energie", $co, $spojeni);
while (list( $datum) = mysql_fetch_row($navrat)){
$datum1[]=$datum;
}
$datum1=implode("','",array_reverse($datum1));
echo <<<EOT
xAxis: {
categories: ['$datum1'],
},
EOT;
?>
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 19. 12. 2011 19:01
V SQL neexistují pojmy "každý druhý, nebo třeba pátý záznam", protože obecně je možné získat záznamy v různém pořadí. Můžeš však chtít záznamy s ID dělitelnými dvěma, třemi nebo pěti.
Možná tuším, co chceš, i když má křišťálová koule mi dává jen mlhavé informace. Pokud měříš v intervalu třeba 10 minut, chceš vytvořit graf denního průběhu, ve kterém bude z každé hodiny jen jedna hodnota. Možná když napíšeš, čeho chceš docílit, najdu vhodné řešení.
Pokud bys chtěl třeba průměrnou hodnotu z každé hodiny, použiješ funkci AVG() a k tomu GROUP BY po hodinách.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 19. 12. 2011 19:10
Ta koule asi není tak mlhavá.
Posílám každých 5 min.
Ale třeba na graf který ukazuje posledních 24 hodin, mi stačí po každé hodině.
A jak píšeš průměr z každé hodiny, to by bylo perfektní.
Kouknu na ty funkce, zatím díky.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 19. 12. 2011 19:31
Neměl bych si spíše udělat v databázi další sloupec
třeba Průměr_hodina a do něj zapisovat po každém 12tém měření (pokud posílám po 5min.) vypočítanou průměrnou hodnotu?
A až poté zapisovat do grafu?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 19. 12. 2011 19:34
Napadá mě tento SQL dotaz, který jen sypu z rukávu bez testování:
SELECT hour(timestamp) AS hodina, avg(teplota) AS T1 from mereni WHERE date(timestamp)=date(now()) GROUP BY hodina ORDER BY hodina;
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 19. 12. 2011 19:39
Pokud si chceš zachovat zbytky zdravého rozumu, tak další databázový sloupec s průměrnými hodnotami nezaváděj. Je to i v rozporu s normalizací databáze. Místo toho stačí sloupec s teplotami indexovat. Index odvede mnohem lepší práci.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 27. 12. 2011 17:18
měřím teplotu a zapisuji do databáze.
Ale občas se stane, že čidlo nahlásí poruchu a vypíše mi nesmyslné číslo 16777216°C, místo třeba22 °C.
Problém je v tom, že mi to rozhází zobrazení grafu. Do databáze zapisuji kařdých pět minut. Tak mě napadlo jestli by nešlo něco takového?
pokud je $teplota vyšší jak 100°C, tak uloží do $teplota
předchozí hodnotu zapsanou v databázi. Ale nevím co dosadit do vzorce.
Poradíte? Díky.
if ($teplota>100) {$teplota = předchozí hodnota v databázi ;}
Nebo nějaké jiné řešení?
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 28. 12. 2011 00:56
Lepší by bylo takovou nesmyslnou hodnotu do databáze vůbec nezapsat. Pokud při vytváření grafu typu XY nějaká hodnota chybí, tak to zpravidla nevadí. V databázích je pro to vyhrazena (ne)hodnota NULL.
|
|
| Reagovat
|
|
Autor: Jiri Hrdlicka (hrdlickovi.wz.cz)
Datum: 28. 12. 2011 15:19
Nepřipadá mi to jako nesmysl. Kdybych měřil každou hodinu, ale měřím každých pět minut a chyba je jednou za cca 24hodin.
Přijde mi to naopak jako elegantní řešení :-)
Pokoušel jsem se tu (ne)hodnotu NULL nějak nasimulovat, co to udělá v grafu, ale navím jak ji zapsat do jednoho "okenka" v databazi.
|
|
| Reagovat
|
|
Autor: Kit (ekobrikety.vyrobce.cz)
Datum: 28. 12. 2011 20:09
Při vkládání nebo přepisování dáš místo 15 nebo 'řetězec' slovo NULL. Je to konstanta vyjadřující prázdnou hodnotu. Není to ani 0, ani prázdný řetězec, je to prostě NULL, tedy nic.
|
|
| Reagovat
|
|
 |
 |