Skocz do zawartości

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....

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
(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

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'];

 

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
<?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";
}

?>

 

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
(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

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.

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?

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";
}

?>

?

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ę »
×
×
  • Utwórz nowe...