Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde
Avatar
Michal Koníček:26. dubna 8:40

Ahoj. Mám skoro hotový projekt, ale nemohu přijít na jeden nedostatek.

Projekt se skládá se z www stránek, na kterých je dostupná registrace uživatelů. Stránky slouží jako rozhraní pro arduino měřící úlohy. Po registraci uživatel se uživatel přihlásí, uložím si jméno uživatele do session a následně provedu zápis tohoto přihlášeného uživatele do tabulky prihlaseni. S takto uloženým jménem v session pracuji na hlavní stránce index, kde ho využívám k zobrazení, kdo je online a k automatickému odhlášení při nečinnosti.

Problém nastává v ten okamžik, kdy se uživatel připojí do měření (měření jede na arduinu, kde formulář s tlačítky vkládám iframem na stránky a data se odesílají z arduina metodou GET) naměří hodnoty a klikne na tlačítko odeslat. Můj skript správně zapíše všechny tyto naměřené hodnoty. Doplnil jsem tento skript také o zápis datumu a id měření. Potřebuji ale také zjistit, který uživatel toto měření naměřil a podle toho vypisovat údaje z databáze.

Pokud zavedu session, ve které si tahám toto jméno přihlášeného uživatele, skript ho nezapíše (zůstane pouze prázdne pole v databázi), ale všechny ostatní informace se zapíší. Pokud se přihlásím na www stránky a spustím v adresovém řádku ručně tento skript, tak echo mě správně zobrazí uživatele a proběhne zápis do databáze i s datumem (hodnoty arduina se zapíší jako nula samozřejmě).

Kde je chyba ? jakto, že tento skript "volaný" pouze arduinem nedokáže převzít tu session a zapsat zároveň s ostatními údaji ? Je potřeba ji nějak ověřovat, než session zde použiji ?

Jsem bezradný, a čas mě tlačí :/ Za pomoc či vyřešení toho problému bych byl velmi vděčný, je to to poslední důležité, co musím opravit. Byl bych rád i za část kódu, jelikož nejsem moc zběhlý ještě v programování a jak říkám, bohužel mě tlačí čas, nečekal jsme tento problém, myslel jsme že to půjde bez problémů.

Přikládám kód skriptu, který slouží pro zápis těchto hodnot.

<?php
session_start();
$spojeni = mysqli_connect("localhost","****","*****","****");
     mysqli_set_charset($spojeni,"utf8");

$datum = date('Y-m-d H:i:s');
$Uzivatelske_jmeno=$_SESSION['prihlaseny_uzivatel'];
echo"$Uzivatelske_jmeno";

  if (mysqli_connect_errno())
  {echo "Problém s připojením na server:" . mysqli_connect_error();}

$pwm = ($_GET["pwm"]);
$av = ($_GET["av"]);

$zapis = mysqli_query($spojeni,"INSERT INTO `optoclen` (`PWM`,`MB1`,`Uzivatel`,`Datum_a_cas`)
                                                VALUES ('$pwm','$av','$Uzivatelske_jmeno','$datum')") or die (mysqli_error($spojeni));
?>
 
Odpovědět 26. dubna 8:40
Avatar
Odpovídá na Michal Koníček
Michal Štěpánek:26. dubna 9:02

Zkusil sis tu session s uživatelem nechat vypsat i v tom iframu? Možná melu nesmysly, ale myslím, že chyba bude v tom, že v tom iframu ta stránka neví, co je v té session za data...

Nahoru Odpovědět 26. dubna 9:02
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
sahlepik
Člen
Avatar
Odpovídá na Michal Koníček
sahlepik:26. dubna 10:23

Není to chybným zápisem SQL příkazu? Název tabulky optoclen máš uvedený v apostrofech:

INSERT INTO `optoclen`
 
Nahoru Odpovědět 26. dubna 10:23
Avatar
Odpovídá na sahlepik
Michal Šmahel:26. dubna 10:39

V tom chyba nebude, to je správně. Ty apostrofy se běžně používají.

Nahoru Odpovědět 26. dubna 10:39
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na Michal Koníček
Michal Šmahel:26. dubna 10:52

Ahoj, řešíš zajímavý problém. Je třeba si tady uvědomit, že iframe je jen rozhraní pro nějakou stránku. Ty když komunikuješ se stránkou v iframe, používají se jiná data - ta stránka posílá svou HTTP hlavičku, SESSION, COOKIES apod.

Pokud to dobře chápu, potřebuješ na tu stránku v iframe odeslat nějaká data (a dostat odpověď). K tomu by se dal využít formulář odeslaný na externí stránku. Funguje jako lokální, jen se data pošlou na adresu mimo stránku, kde momentálně jsi. Data o uživateli předáš např. jako skryté pole.

<form method="post" action="http://externi-stranka.domena">
    <!-- ... ->
    <input type="hidden" name="user" value="<?= $_SESSION['user-id'] ?>">
    <!-- ... ->
</form>
Nahoru Odpovědět 26. dubna 10:52
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Odpovídá na Michal Koníček
Uživatel sítě :26. dubna 13:26

Adresy (domény) jsou rozdílné hádám, že? Pokud ano, tak k url ve frame, které načítáš bych dodal vždy identifikační parametr uživatele pod kterým uložím ty data. Provedeš pouze ověření zda je identifikace správná.

Nahoru Odpovědět  +1 26. dubna 13:26
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Michal Koníček:26. dubna 15:43

Jakmile uživatel zadá měření, proběhnou dva skripty s podmínkami a nakonec se vloží stránka s měřením. Adresy framu jsou pro školní síť a jsou od správce sítě převedeny na veřejnou adresu. Jeden frame je pro webkameru a jeden pro samotné měření a ten skrytý je pojezd na kterém je upevněna kamera. Web má 77.48.244.198 i všechny tři framy mají stejnou síť, až poslední část ip s portem jsou rozdílné. Pouze arduino, jelikož ho mám doma jede na mojí síti zatím.

Jak bych měl tuto identifikaci zadát a jak to otestovat ?
Ještě jsme si uvědomil, že jsme neměl všude na tech podmínkových stránkách a této session start, ale i tak to teď nezapisuje.

<?php
    session_start();
?>

<html>
<head>
   <style type="text/css">
       h3 {text-align:left;}
       h4  {text-align:left;}
       </style>
</head>
<body>

<h2>Měření na fototranzistoru</h2>
<br>
<iframe src="http://77.48.244.194:****/?PWM=0"style="display:none;"></iframe>

<h3>Ovládací panel úlohy a pohled online kamery na prováděnou úlohu</h3>

<iframe src="http://192.168.1.***"width="420" height="340" style="float:left"></iframe>
<iframe src="http://77.48.244.194:****/snapshot.cgi" width="435" height="300" style="float:left"></iframe>

<h4>Popis</h4>
<p>Mezi první měření patří měření na fototranzistoru.....</p>
</body>
</html>
 
Nahoru Odpovědět 26. dubna 15:43
Avatar
Odpovídá na Michal Koníček
Michal Šmahel:26. dubna 15:53

Jak píše Uživatel sítě , v tomto případě bude stačit předat data o uživateli přes GET (stačí za adresu přidat ?klic=hodnota&klic2=hod­nota2...).

<iframe src="adresa-arduina?uzivatel=<?= $_SESSION['uzivatel-id'] ?>" ...></iframe>
Nahoru Odpovědět  +1 26. dubna 15:53
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Michal Koníček:26. dubna 17:59

A Jak docílím toho uložení ? jak to zapsat to skriptu log_optoclen, který se stará právě o zápis do databáze ? arduino zapisuje metogou GET

client.print("GET http://dalkovemereni.vos.cz/log_optoclen.php?");
client.print("pwm=");
client.print("&av=");
...

pak již následuje nahoře zmíněný skript. Stále mě není jasné jak to mohu převzít z teho framu, i když to za tu URL opíšu. Taky metodou GET ?

 
Nahoru Odpovědět 26. dubna 17:59
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27. dubna 8:03

Jak pise 'Michal Šmahel'.
stranka login -> server1 (77.48.244.198) -> session server 1
zadny login -> server2 (77.48.244.194:****) -> session server2
zadny login -> server3 (192.168.1.***) -> session server2
Kazdy ten server ma vlastni session (php), vlastni login.

Pokud tam mas jen zarizeni, kde login zadny nemas, a chces tam neco posilat, musis to posilat treba pres get, v pripade webkamery. Jestli mas tu stranku, jak mas, tak staci to, co psal 'Michal Šmahel'
<iframe src="adresa-arduina?uziva­tel=<?= $_SESSION['uzivatel-id'] ?>" ...></iframe> nebo
<iframe src="adresa-arduina?uziva­tel=<?php echo $_SESSION['uzivatel-id']; ?>" ...></iframe>
V prohlizeci si dej 'Zobrazit zdrojovy kod stranky' a uvidis, zda tam je kod treba
<iframe src="adresa-arduina?uziva­tel="></iframe> nebo spravne
<iframe src="adresa-arduina?uziva­tel=peter"></i­frame> -- toto potrebujes docilit
Jeste by to mozna chtelo dat tam mozna isset, jestli v session ten parametr existuje.

$x = isset($_SESSI­ON['uzivatel-id']) ? $_SESSION['uzivatel-id'] : ''; - Precteni session
$x = isset($_GET['u­zivatel']) ? $_SESSION['uzi­vatel'] : ''; - Precteni get

https://github.com/…examples.rst

client.print(String("GET /") + " HTTP/1.1\r\n" +
             "Host: " + host + "\r\n" +
             "Connection: close\r\n" +
             "\r\n"
            );

Jestli to spravne chapu, tak ten zapis je klasicke vytvoreni hlavicky jako u emailu. V PHP bys to psal

$arr = array(
    "GET / HTTP/1.1", // metoda get, protokol http
    "Host: " . $host, // host
    "Connection: close", // ukonceni spojeni
    "");
$str = implode("\r\n",$arr);
Editováno 27. dubna 8:05
 
Nahoru Odpovědět  +1 27. dubna 8:03
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Peter Mlich
Peter Mlich:27. dubna 8:08

A tez jsem vygoogloval zapis, jaky pouzivas ty.

client.print("GET http://arduinoalter.altervista.org/NuovoFile.php?user=12");

Proste, klasicka adresa jako u odkazu v html. Viz ten zapis se session, to je totez, take adresa odkazu.

 
Nahoru Odpovědět  +1 27. dubna 8:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.