1 Naposledy upravil: nesvara (2011-11-04 08:09:02)

Téma: Chyba v PHP skriptu

Prosím o opravu toho PHP skriptu.

<?php
$data=file_get_contents('http://IPAdresa/cgi_dyeA?rand');
echo "Data: ".$data;
echo "<br>";
echo "<br>";
$data1=file_get_contents('http://IPAdresa/get_sys[493]?rn=69');   ZDE JE ASI PROBLÉM S HRANATÝMI ZÁVOKAMI - JAK TO ZAPSAT SPRÁVNĚ
echo "Data1: ".$data1;
echo "<br>";
?>

DĚKUJI

2 Naposledy upravil: nesvara (2012-01-02 17:59:57)

Re: Chyba v PHP skriptu

Pro upřesněn doplňuji odkaz kde je problém. Kontaktoval jsem i poskytovatele stránek - zatím bez úspěchu.

http://www.nesvara.cz/datan2.php - již není funkční

Konkrétní kód:

<html>
<head>
</head>
<body>
<h1>Vyčtení dat s SDS-S Micro</h1>
<br>
<?php
$data=file_get_contents('http://IP adresa/cgi_dyeA?rand');
echo "Data: ".$data;
echo "<br>";
echo "<br>";
$data1=file_get_contents('http://IP adresa/get_sys[493]?rn=69');
echo "Data1: ".$data1;
echo "<br>";

$fp1 = fopen('http://IP adresa/get_sys[493]?rn=4', 'rb') or die ("nejde otevrit vzdaleny obsah");
$tempname = tempnam('/tmp', 'foo');
echo "<br/> tempname $tempname <br/>";
$fp2 = fopen ($tempname, "wb")   or die ("<br/>nejde otevrit $tempname for writing<br/>");
$contents = fread ($fp1,102400);
echo "<br/>zapis do $tempname are $contents<br/>";
fwrite($fp2, $contents)  or die ("<br/>nemuze zapsat do $tempname<br/>");
fclose($fp2);fclose($fp1);
?>
</body>
</html>



Děkuji

josef@nesvara.cz

3

Re: Chyba v PHP skriptu

položka "rand" v parametrech se používá kvůli prohlížečům, které mají v oblibě ukládat stránky do cache, a pak místo komunikace s webovým serverem ušetří čas tím, že vrátí výsledek ze své cache. Tak projde první dotaz, kdy proběhne komunikace prohlížeče s SDS, ale všechny ostatní dotazy už prohlížeč do SDS nepošle.
Proto se tam dává něco, co způsobí, že bude dotaz pokaždé jiný. Zvolili jsme název "rand" protože to vystihuje o co se jedná.
Jen je potřeba tam ještě dodat to skutečné náhodné číslo, takové, aby byl ten dotaz pokaždé jiný.

Takže by tam mělo být něco jako " ?rand=Math.random() " nebo tak něco, co bude v konkrétním jazyku fungovat.

Hranaté závorky - to může být v PHP problém.

Protože se ale jedná o URL text, je možné použít trik se zápisem kódu znaku.

[ (levá hranatá závorka) %5B
] (prava hranatá závorka) %5D

Takže např. get_sys%5B123%5D odpovídá get_sys[123] .

Doufám že ty čísla za % mám dobře.

Líbí se mi celkový přístup k věci, pěkni si to pomalu a postupně vyzkoušet, odladit...

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

4 Naposledy upravil: nesvara (2012-01-02 18:08:58)

Re: Chyba v PHP skriptu

Zkusil jsem upravit skript takto:

<html>
<head>
</head>
<body>
<h1>Vyčtení dat s SDS-S Micro</h1>
<br>
<?php
$data=file_get_contents('http://ipadresa/get_sys%5B141%5D?rn=4&rand');
echo "Data: ".$data;
echo "<br>";
echo "<br>";

?>
</body>
</html>

na adrese :   http://www.nesvara.cz/datan5.php - již není funkční

je vrácena tato hláška

Vyčtení dat s SDS-S Micro



Warning: file_get_contents(http://IPadresa/get_sys%5B141%5D?rn=4&rand) [function.file-get-contents]: failed to open stream: HTTP request failed! 0|0|0|0 in /www/doc/www.nesvara.cz/www/datan5.php on line 8
Data:

5

Re: Chyba v PHP skriptu

Prosím o pomoc,
stále se mi nedaří najít funkci v PHP, která bez chybové hlášky bezproblému vrátila hodnoty proměnných ('http://IPAdresa/get_sys[493]?rn=5').
Nepodařilo se to zatím ani známým, kteří v PHP programuji. Pokoušel jsem se také kontaktovat poskytovatele hostingu, ale bez konkrétního řešení.
Děkuji

6

Re: Chyba v PHP skriptu

A jaká je ta chybová hláška? Je to chyba zápisu PHP programu (tzn. hlásí to server na kterém je skript spouštěn) nebo se jedná o HTTP chybu (např. 404) ?

Problém bude v těch hranatých závorkách, ty je potřeba zapsat jinak (viz %xx)

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

7 Naposledy upravil: nesvara (2012-01-02 18:02:24)

Re: Chyba v PHP skriptu

Možná jsem to špatně popsal.
Vše je přesně popsáno ve výše uvedených příspěvcích.
Zopakuji vše ještě jednou:

Skript ve kterém jsou nahrazeny závorky, je uložen na adrese:   http://www.nesvara.cz/datan5.php - již není funkční

<html>
<head>
</head>
<body>
<h1>Vyčtení dat s SDS-S Micro</h1>
<br>
<?php
$data=file_get_contents('http://IPadresa/get_sys%5B141%5D?rn=4&rand');
echo "Data: ".$data;
echo "<br>";
echo "<br>";
?>
</body>
</html>

Výsledná hláška:

Vyčtení dat s SDS-S Micro

Warning: file_get_contents(http://IPadresa/get_sys%5B141%5D?rn=4&rand) [function.file-get-contents]: failed to open stream: HTTP request failed! 0|0|0|0 in /www/doc/www.nesvara.cz/www/datan5.php on line 8
Data:


Lze vidět i přímo zadáním:  http://www.nesvara.cz/datan5.php - již není funkční

8

Re: Chyba v PHP skriptu

Ok, tak teď už je mi to zřejmé.

Problém je v použití funkce file_get_contents.

Tato funkce očekává celý HTTP soubor, tzn. i hlavičku atd. což však SDS pro tento příkaz neodesílá.

Je potřeba použít jinou PHP funkci, která umí přijmou data z HTTP serveru, a neočekává přitom hlavičku.


Do nové verze firmware přidáme možnost odeslání i s hlavičkou, pokud se nastaví další parametr (toto bude teprve určeno), pak by i file_get_contents funkce měla fungovat.
Nevím ale kdy to bude k dispozici. Proto je teď potřeba použít řešení jiné.

Např. getRawResponseMessage z HttpRequest.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

9 Naposledy upravil: nesvara (2012-01-02 18:05:42)

Re: Chyba v PHP skriptu

Pokusím se  dále bádat,
přece jen ale ještě jedna informace.
V odkazu  http://www.nesvara.cz/datan2.php - již není funkční                       je skript

<html>
<head>
</head>
<body>
<h1>Vyčtení dat s SDS-S Micro</h1>
<br>
<?php
$data=file_get_contents('http://IPadresa/cgi_dyeA?rand');
echo "Data: ".$data;
echo "<br>";
echo "<br>";
$data1=file_get_contents('http://IPadresa/get_sys[493]?rn=69');
echo "Data1: ".$data1;
echo "<br>";

$fp1 = fopen('http://IPadresa/get_sys[493]?rn=4', 'rb') or die ("nejde otevrit vzdaleny obsah");
$tempname = tempnam('/tmp', 'foo');
echo "<br/> tempname $tempname <br/>";
$fp2 = fopen ($tempname, "wb")   or die ("<br/>nejde otevrit $tempname for writing<br/>");
$contents = fread ($fp1,102400);
echo "<br/>zapis do $tempname are $contents<br/>";
fwrite($fp2, $contents)  or die ("<br/>nemuze zapsat do $tempname<br/>");
fclose($fp2);fclose($fp1);
?>
</body>
</html>


Data, která jsou volána tímto příkazem jsou vrácena v pořádku   http://IPadresa/cgi_dyeA?rand
ale data, která jsou volána tímto http://IPadresa/get_sys[493]?rn=4  a  http://IPadresa/get_sys[493]?rn=69
jsou vrácena takto

Data: 20:57:16 12.11.2011|Tarif|0|Denni proud|Nocni proud|Elektromer spotreba|4402.868 kWh|Okamzity vykon:|0.559 kW|0.00 CZK|4402.868 kWh|0.000 kWh|Elektromer dodavka|5656.984 kWh|Okamzity vykon:|0.0 kW|0.00 CZK|5656.984 kWh|0.000 kWh|Elektromer FVE|5740.506 kWh|Okamzity vykon:|0.0 kW|0.00 CZK|5740.506 kWh|0.000 kWh|0|


Warning: file_get_contents(http://IPadresa/get_sys[493]?rn=69) [function.file-get-contents]: failed to open stream: HTTP request failed! 1100717|1414246|11481013|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 in /www/doc/www.nesvara.cz/www/datan2.php on line 12
Data1:

Warning: fopen(http://IPadresa/get_sys[493]?rn=4) [function.fopen]: failed to open stream: HTTP request failed! 1100717|1414246|11481013|0 in /www/doc/www.nesvara.cz - již není funkční /www/datan2.php on line 16
nejde otevrit vzdaleny obsah

viz. http://www.nesvara.cz/datan2.php - již není funkční

10 Naposledy upravil: nesvara (2012-01-02 18:06:56)

Re: Chyba v PHP skriptu

Ještě další poznatek,
pokud z internetu otevřu stránku  http://IPadresa/fve.htm načtou se bezproblémů všechna data. Pokud si ale tuto stránku otevřu v prohlížeči v televizi (LG) nebo v telefonu (např. s operačním systémem ANDROID) načítají se pouze data volána tímto příkazem http://IPadresa/cgi_dyeA?rand,       ale data  volána   http://IPadresa/get_ram[140]?rn=7 ([140]?rn=7 -zde je konec celé funkce)  se  nenačítají.  VIZ. zdrojový kód stránky
Připadá mi, zda toto není způsobeno  funkcí  get_ram........... , kterou nechtějí načítat některé prohlížeče kvůli bezpečnosti nebo z jiných důvodů.

Vše je možno vyzkoušet viz.     http://IPadresa/fve.htm

11

Re: Chyba v PHP skriptu

Ano to je tím že tam asi chybí ta HTTP hlavička (odpověď serveru) a jen se posílají data... ale ještě jsem se na to nedíval.

PS: když se používá parametr "rand", je potřeba ho vyplnit (Math.random() viz jiné příklady).

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

12 Naposledy upravil: nesvara (2012-01-02 18:07:56)

Re: Chyba v PHP skriptu

Kompletně vyplněný parametr je zde (neuvedl jsem jej celý)  viz. zdrojový kód      IPadresa/fve.htm



if (reqDENMESROK){

    reqDENMESROK.open("GET", "http://IPadresa/get_ram[140]?rn=7&rand="+Math.random(), true);

    reqDENMESROK.onreadystatechange = reqCompleteDENMESROK;

    reqDENMESROK.send(null);

13

Re: Chyba v PHP skriptu

Vše vyřešil nový firmware - s kulatými závorkami vše funguje.