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.
našel jsem ještě tohle: wb import from XML
ale nenašel jsem k tomu nějaký srozumitelný návod, jak na to.
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());
?>
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.
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
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.
nikde nic prázdného není
109.80.22.31/xml.xml
Ale je. Definuješ proměnnou
$plyn_celkem_dole= $xml->snmp->s0_0->text;
a používáš nedefinovanou proměnnou
$plyn_celkem
$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
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 )
Není možné že to je proto, že mám v db více sloupců do kterých tímto skriptem neposílám?
A posílám jiným?
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();
}
?>
- Proč tam máš pole $_GET?
- K čemu je pole $raw_udaje?
- Proč místo seznamu proměnných dáváš do INSERTu seznam hodnot?
Mám podobný skript který již používám tak jsem jej "upravil"
-nevím
-nevím
-má chyba :-)
$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);");
hmm jednoduché a funguje to.
Ale nebyl jsem daleko. :-)
Děkuji
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.
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.
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í.
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.
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;
?>
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.
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.
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?
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;