Skocz do zawartości
SOYER

Arduino MEGA i BLYNK, LCD odchodzi do lamusa...

Pomocna odpowiedź

Tak, bazę i całą stronę mam na malince, pracuję na laptopie gdzie w oknie przeglądarki mam wpisane adresIPmalinki/powietrze/index1.html, i sobie oglądam moją stronę, zmiany wprowadzam oczywiście na plikach znajdujących się na malince...

w phpmyadmin jestem zalogowany jako pi z jakimś tam hasłem i na tym koncie mam moją tabelkę, wszystko obsługuję z okna przeglądarki w moim laptopie adresIPmalinki/phpmyadmin

coś powinienem poprzestawiać?

Udostępnij ten post


Link to post
Share on other sites

Jeśli robisz to w ten sposób to nic nie przestawiasz.

Jeśli chcesz pooglądać błędy, wywołaj z palca skrypt getData z odpowiednimi parametrami, np.:

adresIP/powietrze/getData.php?name=pm10&mian=kg

(chyba nie pomyliłem nazw parametrów?)

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

http error 500 :-))

parametry zmieniłem na prawidłowe, nazwa i mian...

Edytowano przez SOYER

Udostępnij ten post


Link to post
Share on other sites

Odpowiedź masz gdzieś w logach Apacza (nie mam go na malince więc pewnie mam trochę inaczej, u mnie to /var/log/apache2/error.log).

http error 500 to inaczej wewnętrzny błąd serwera, czyli właśnie w logach trzeba szukać odpowiedzi.

Odpal na malince coś w stylu

tail -f /var/log/apache2/error.log

i wtedy spróbuj wleźć na stronę

 

Udostępnij ten post


Link to post
Share on other sites
<?php
include 'logMeteo.php';
$typ = $_GET['nazwa'];
$b = $_GET['mian'];
$polaczenie = new mysqli($host, $db_user, $db_pass, $db_name);
if($polaczenie->connect_errno!=0){
    die("Error: ".$polaczenie->connect_errno."Opis: ".$polaczenie->connect_error);
}
   $typ = $_REQUEST['typ'];
    function getCurrentStatus($typ) {
      global $polaczenie;
      $typ = $mysqli->real_escape_string($typ);
      $sqlOdczyt="SELECT aktualna FROM meteo WHERE czujnik = '${typ}'";
      $odczyt=$polaczenie->query($sqlOdczyt);
$row = $odczyt->fetch_row();
      $odczyt->close();
      return $row[0];
    }

   $result = getCurrentStatus($typ);

echo $result.$b;
?>

dla tego pliku jest taki błąd:

2019-01-25 21:40:22: (mod_fastcgi.c.2543) FastCGI-stderr: PHP Parse error:  syntax error, unexpected '?' in /var/www/html/powietrze/getData.php on line 15
Gdzi on tam widzi "?" to ja nie wiem....

postawiłem kursor na końcu tej 12 lini i dałem delete, zniknął tamten bląd z pytajnikiem....ale pojawiły się takie:

2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: PHP Notice:  Undefined index: typ in /var/www/html/powietrze/getData.php on line 9
2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: PHP Notice:  Undefined variable: mysqli in /var/www/html/powietrze/getData.php on line 12
2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: PHP Fatal error:  Uncaught Error: Call to a member function real_escape_string() on null in /var/www/html/powietrze/getData.php:12
2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: Stack trace:
2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: #0 /var/www/html/powietrze/getData.php(20): getCurrentStatus(NULL)
2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: #1 {main}
2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr:   thrown in /var/www/html/powietrze/getData.php on line 12
 

Udostępnij ten post


Link to post
Share on other sites
30 minut temu, SOYER napisał:

postawiłem kursor na końcu tej 12 lini i dałem delete, zniknął tamten bląd z pytajnikiem...

Jakiś śmieć - jakiego edytora używasz? Polecam Komodo Edit

32 minuty temu, SOYER napisał:

2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: PHP Notice:  Undefined index: typ in /var/www/html/powietrze/getData.php on line 9

A czy w wywołaniu podałeś parametr typ? Nie? I się dziwisz?

W ogóle masz nie wiadomo dlaczego na początku $_GET (ajax tego nie złapie), a potem $_REQUEST, tyle że pierwszy raz typ to name a drugi raz typ to typ... może trochę porządku w kodzie by się przydało?

34 minuty temu, SOYER napisał:

2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: PHP Notice:  Undefined variable: mysqli in /var/www/html/powietrze/getData.php on line 12

Nic dziwnego, bo mysqli to klasa a obiekt u Ciebie nazywa się $polaczenie. Nie ma jak bezmyślne kopiowanie...

35 minut temu, SOYER napisał:

2019-01-25 21:55:11: (mod_fastcgi.c.2543) FastCGI-stderr: PHP Fatal error:  Uncaught Error: Call to a member function real_escape_string() on null in /var/www/html/powietrze/getData.php:12

No nic dziwnego - jeśli $typ jest null )parrz błąd numer jeden) to raczej ciężko się go eskejpuje...

Zrób porządek z kodem, pomyśl co znaczy każda linijka, ja Ci te linijki mogę napisać ale podobno chcesz się uczyć a nie dostać gotowy kod, prawda?

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@ethanak mój przyjacielu;-) teraz proszę chociaż o słowo komentarza i wytłumaczenia dlaczego tak... powyższy kod nie chce działać za chiny ludowe ale ten(jakby prostszy) działa bez problemu:

<?php
include 'logMeteo.php';
$typ = $_GET['nazwa'];
$b = $_GET['mian'];
$polaczenie = new mysqli($host, $db_user, $db_pass, $db_name);
if($polaczenie->connect_errno!=0){
    die("Error: ".$polaczenie->connect_errno."Opis: ".$polaczenie->connect_error);
}
$sqlOdczyt="SELECT aktualna FROM meteo WHERE czujnik = '$typ'";
$odczyt=$polaczenie->query($sqlOdczyt);
$row = $odczyt->fetch_row();
$odczyt->close();
$result = $row[0];

echo $result." ".$b;
?>

to zrobiłem ja;-D, dzięki za cynk z tymi logami błędów.... parę elementów było zbędnych? żle zdefiniowanych? o co chodzi?

 

Ok, dla pokazania tym co nie wiedzą o czym mowa

Poprzednia wersja strony z losowymi danymi:

aktualna z danymi pobieranymi z serwera:

Różnica niby żadna, ale ile mnie to czasu kosztowało, a ile cierpca u ethanaka;-) 

 

No nareszcie jakieś serducho od @Treker ;-), myślałem, że już nie doczekam:-D...

Edytowano przez SOYER
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A teraz wyobraź sobie, że ktoś złośliwy wywoła Twoją stronę w ten sposób:

http://twójIP/powietrze/getData.php?nazwa=pm10%27%2Bdelete+from+meteo%3Bselect+%275&mian=kg

Jak myślisz, gdzie będą Twoje dane?

Której ważnej linijki się pozbyłeś?

 

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Ok, to teraz dołożymy je po kolei, z objaśnienie, co i jak ona robi... ok? 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@ethanak teraz:

<?php
include 'logMeteo.php';
$typ = $_GET['nazwa'];
$b = $_GET['mian'];
$typ = $_REQUEST['nazwa'];

$polaczenie = new mysqli($host, $db_user, $db_pass, $db_name);

if($polaczenie->connect_errno!=0){
    die("Error: ".$polaczenie->connect_errno."Opis: ".$polaczenie->connect_error);
}

      $typ = $polaczenie->real_escape_string($typ);
      $sqlOdczyt="SELECT aktualna FROM meteo WHERE czujnik = '${typ}'";
      $odczyt=$polaczenie->query($sqlOdczyt);
      $row = $odczyt->fetch_row();
      $odczyt->close();
      $result = $row[0];

echo $result." ".$b;

?>

Choć nie do końca rozumiem co ta funkcja robi(real_escape_string())... funkcja dodaje znaki do stringa po to żeby zabezpieczyć dane...

coś więcej?

a może powinno być również:

 $typ = $polaczenie->real_escape_string($typ);
      $b = $polaczenie->real_escape_string($b);


 

Edytowano przez SOYER

Udostępnij ten post


Link to post
Share on other sites
3 godziny temu, SOYER napisał:

funkcja dodaje znaki do stringa po to żeby zabezpieczyć dane...

 

Dokładnie tak. Na stronie którą Ci podałem był przykład ze stringiem zawierającym cudzysłów.

Gdybyś wywołał swój skrypt bez eskejpowania z takim parametrem jak podałem wcześniej, mySQL otrzymałby zapytanie:

"select aktualna from meteo where typ = 'pm10';delete from meteo; select '5'"

Wykonałby bardzo grzecznie wszystkie polecenia po kolei.. przy czym po wykonaniu drugiego nie miałbyś już danych w bazie.

Po zastosowaniu real_escape_string zapytanie byłoby inne - mianowicie do klauzuli where przekazanyby został string:

"pm10';delete from meteo;select '5"

Oczywiście wykonanie skryptu skończyłoby się (zupełnie niegroźnym) błędem (ponieważ żaden z rekordów w bazie nie zawiera takiej wartości) i to wszystko.

3 godziny temu, SOYER napisał:

a może powinno być również:


 $typ = $polaczenie->real_escape_string($typ);
      $b = $polaczenie->real_escape_string($b);

 

Nie. Ponieważ zmiennej $b nie przekazujesz do żadnego zapytania MySQL - żadna jej wartość nie jest groźna; po prostu zostanie wypisana na ekranie w tej postaci, jaka została podana jako parametr. Natomiast na pewno pouczające by było zastosowanie eskejpowania również do zmiennej $b i obserwowanie, jak skrypt będzie reagować na różne parszywe znaczki typu apostrof. Na pewno pomoże to w zrozumieniu, na czym cały pic polega.

 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Dzięki. 

Teraz? Wspomniane wcześniej rozbudowanie bazy. Kompletna przebudowa? 

Bo wysyłanie do bazy pewnie na koniec... 

Udostępnij ten post


Link to post
Share on other sites

Kompletna przebudowa, ale to już nie dzisiaj bo niespecjalnie mam czas (chyba że wieczorem coś tam urwę).

Możesz w międzyczasie jeszcze dopieścić ten kod (będzie to potrzebne później): jeśli w bazie danych nie ma aktualnej wartości dla danego typu, powinien zwrócić tekst "Brak danych".

Bazujesz na tym, że mysql_result::fetch_row() zwraca FALSE jeśli nie ma już więcej danych do pobrania.

A ja sobie pomyślę jak tu najprościej i najefektywniej zrobić tę tabelkę w MySQL-u (wybacz, ja raczej jestem spec od PostgreSQL-a, MySQL-em zajmuję się tylko jeśli muszę i to też na zasadzie podręcznika otwartego w zakładce obok).

Udostępnij ten post


Link to post
Share on other sites

Generalnie to wiele więcej mi nie trzeba, z tego co przychodzi mi do głowy, to pamięć wartości na tyle by móc później budować wykresy, wartości max i min z określonego czasu... 

nie ma co wariować... tyle żeby poćwiczyć różne opcje... 

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×