Skocz do zawartości
SOYER

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

Pomocna odpowiedź

Wcześniej sugerowałem się tym:

https://www.w3schools.com/php/php_mysql_select.asp

a teraz przekopiowałem i pozmieniałem nazwy:

<?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);
      
if ($odczyt->fetch_row > 0) {
    while($row = $odczyt->fetch_row()) {
        $result = $row[0];
        echo $result." ".$b;
    }
} else {
    echo "0 results";
}
?>

Tyle że masz rację, to "0" to taki sobie pomysł, tym bardziej, że domyślnie w pustych polach mojej tabelki są zera....

Udostępnij ten post


Link to post
Share on other sites

Znowu babol...

Czy Ty w ogóle rozumiesz jak działa fetch_row()?

Udostępnij ten post


Link to post
Share on other sites

Nie

Udostępnij ten post


Link to post
Share on other sites

No to trzeba było tak od razu powiedzieć a nie zachowywać się jak małpa przy maszynie do pisania.

Wspomniałem już, że zwracany przez mysqli::query mysqli_result to iterator. Metody fetch_row, fetch_array i fetch_all pobierają kolejne wyniki z owego iteratora i zwracają tablicę (po phpowemu "array"), a nie jakieś wartości numeryczne które sobie możesz do zera porównywać. A jeśli wyników więcej nie ma, zwraca null (którego porównywanie z zerem nie ma większego sensu).

Stąd nie możesz użyć dwa razy fetch_row() mając nadzieję, że zwróci dwa razy ten sam wiersz wyniku. czyli - jeśli w swoim programie pobierasz dokładnie jeden wiersz - musisz użyć fetch_row() dokładnie raz.

A więc nie dlatego pisałem o niespecjalnie dobrym pomyśle porównywania fetch_row() z zerem, że w tabeli mogą wystąpić wartości zerowe.

Natomiast wynik fetch_row() (czyli tablica o większej niż zero ilości elementów lub null) idealnie się nadaje jako warunek w instrukcji if...

Tak przy okazji: objaśnij mi wreszcie co mają znaczyć te linijki:

$typ = $_GET['nazwa'];
$b = $_GET['mian'];
$typ = $_REQUEST['nazwa'];

szczególnie co tam robi $_GET (przecież AJAX leci przez POST a nie GET, nie mów że nie znasz podstaw protokołu HTTP).

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
5 minut temu, ethanak napisał:

Tak przy okazji: objaśnij mi wreszcie co mają znaczyć te linijki:

Przecież jak pytałem o to jak php ma pobrać dwie dane, to sam spokojnym i stonowanym głosem kazałeś mi sobie przypomnieć swoją lekcję z ?factor w adresie...

To co robią te przykłady które Ci pokazałem tu: https://www.w3schools.com/php/php_mysql_select.asp

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Ale ja nie rozumiem, dlaczego pobierasz 'nazwa' dwa razy i dlaczego 'mian'  szukasz w $_GET a nie $_REQUEST...

A co do przykładów to one są akurat prawidłowe - tyle że num_rows() a fetch_row to dwie różne rzeczy.

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites

Czyli $_REQUEST to zmienna pobierana ze źródeł zewnętrznych, tak samo jak $_GET i $_POST, tylko, że dodatkowo jest zmienną globalną, dostępną w każdym miejscu skryptu, choć nie wiem co to w praktyce oznacza...

Czyli ma być

$typ = $_REQUEST['nazwa']; 

$b = $_REQUEST['mian'];

 

Udostępnij ten post


Link to post
Share on other sites

Ogólnie $_REQUEST to tak jakby $_GET i $_POST w kupie - nie pamiętam w której wersji PHP to się pokazało (kiedyś było tylko $_GET i $_POST), ale to bardzo wygodne bo masz dostęp do parametrów niezależnie od tego, czy zostały przesłane przez URL (GET) czy przez ciało requestu (POST). A "dostępne w każdym miejscu skryptu" to mniej więcej oznacza, że nie trzeba ich deklarować jako globalnych np. wewnątrz funkcji.

I tak, tak powinno być.

Zrobisz to z tym "Brak danych" czy czegoś jeszcze potrzebujesz?

 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
<?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];
if ($row[co tu ma być? "1"?] > 0) {
     echo $result." ".$b;
    }
} else {
    echo "0 results";
}

?>

 

Udostępnij ten post


Link to post
Share on other sites

nie nie nie nie nie nie nie nie...

Nic nie zrozumiałeś.

Przede wszystkim: wykonujesz $result=$row[0]  nie sprawdzając, czy $row jest faktycznie tablicą a nie nullem. Owszem, PHP jest (niestety) na tyle tolerancyjny że nie wykrzaczy się na takej instrukcji (bo gdyby się wykrzaczał to jakieś 99.9% stron pisanych przez Wybitnych Specjalistów od PHP by nie działało) - ale nie znaczy to że tak można!

Kawałek kodu:

if ($row = $odczyt->fetch_row()) {
  $result = $row[0];
  $odczyt->close();
  echo $result . " " . $b;
} else {
  echo "Brak danych";
}

Rozumiesz o co tu biega?

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

jeśli $row = $odczyt->fetch_row() jest prawdą to wykona się warunek, a jeśli jest prawdą to nie jest NULLem, si?

 

Edytowano przez SOYER

Udostępnij ten post


Link to post
Share on other sites

Si, señor.

Udostępnij ten post


Link to post
Share on other sites

no to chyba załapałem, szkoda, że dopiero jak pokazałeś mi gotowca. 

Teraz to zrozumiałem, że fetch_row zwraca tablicę z zapytania query, zapisuję tę tablicę do $row, a wyciągamy z tej tablicy pierwszy zapis do $result przez $result = $row[0]; , a [0] bo ta tablica jest numerowana od zera....

Dzięki.

Udostępnij ten post


Link to post
Share on other sites

No i o to chodziło 🙂

Nie przejmuj się - ja też najszybciej się uczę kiedy widzę kod.

To co, możemy pogadać o tabelce MySQL-a czy masz dość na dzisiaj?

Udostępnij ten post


Link to post
Share on other sites

a może byc tak?

<?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();
if ($row) {
    $result = $row[0];
     echo $result." ".$b;
    }
} else {
    echo "0 results";
}

?>

?

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...