Uzyskaj dostęp do bazy danych z poziomu języka programowania PHP

Uzyskaj dostęp do bazy danych z poziomu języka programowania PHP

Uzyskaj dostęp do bazy danych z poziomu języka programowania PHP

Spis treści

    Serwer WWW IoTSerwer WWW HTTP POST IoTBaza danych MySQL. Serwer WWW IoTSerwer WWW IoT w języku PHP

    W ostatnim artykule z serii na temat Wykorzystanie serwera WWW do przechowywania danych z urządzeń podłączonych do Internetu Rzeczy, wyjaśnia, jak zapisywać w bazie danych MySQL informacje, które węzły IoT wysyłają do serwera wysyłającego żądania HTTP POST. Czytelnicy tego artykułu i całego bloga mogą nie być szczególnie zaznajomieni z programowaniem w środowisku Język PHP ale na pewno tak z programowaniem mikrokontrolery w językach C o C + + więc poza pewnymi szczegółami, takimi jak poprzedzanie znaku dolara ($) zmiennymi, będziesz mógł postępować zgodnie z przykładami bez potrzeby dalszych wyjaśnień, ponieważ zostały one wykonane zgodnie z bardzo neutralnym stylem programowania, nie specyficznym dla PHP.

    Przechowuj informacje w bazie danych

    Jak wyjaśniono w artykule dot Przechowywanie danych IoT poprzez wysyłanie żądań HTTP POST do serwera WWWna końcu nagłówków treść żądania POST zawiera dane wysyłane do serwera. Najpopularniejszym sposobem przesyłania tych informacji na serwer jest format zwykłego tekstu, ponieważ łatwiej jest je analizować nawet „ręcznie”. Gdy dane wysyłane na serwer są złożone, z pewnością wygodnie będzie je ustrukturyzować, stosując np. format XML o JSON. W typowym zastosowaniu serwera WWW do zarządzania informacjami z urządzeń podłączonych do Internetu rzeczy nie jest powszechna potrzeba struktury danych, dlatego normalne jest wysyłanie ich zwykłym tekstem w formacie variable=valor.

    W żądaniu HTTP POST z poniższego przykładu z serwera polaridad.es żądany jest zasób (zwykle strona internetowa) /iot/grabar_temperatura i wysyłane są trzy zmienne: ne, tp i cr, które odpowiednio zawierają wartości „ 12”, „10.26” i «2.18» Należy również pamiętać, że nagłówki od danych oddziela pusta linia.

    Ostateczny cel poniższego kodu PHP wyśle ​​do serwera bazy danych MySQL zamówienie SQL:

    Za pomocą którego zostanie utworzony nowy rekord (INSERT)
    w bazie ciepłowniczej (INTO calefacciones)
    przypisywanie do pól (numero_estancia,temperatura,corriente)
    wartości odpowiadające żądaniu HTTP POST VALUES (12, 10.26, 2.18)

    Połączenie z bazą danych odbywa się za pomocą funkcji mysqli_connect zgodnie z formatem: mysqli_connect($servidor,$usuario,$clave,$base_datos) który zwraca wskaźnik do obiektu połączenia i który używa zmiennych definiujących dostęp (takich jak nazwa użytkownika, hasło...) i które zostały wcześniej przypisane do przyszłych hipotetycznych zastosowań w skrypcie.

    Aby sprawdzić, czy połączenie się powiodło, używana jest funkcja mysqli_connect_errno() która zwraca numer błędu, który mógł wystąpić lub zero (fałsz), jeśli połączenie zostało nawiązane poprawnie. Aby powiadomić o błędach, aplikacja wysyłająca żądanie HTTP otrzymuje w odpowiedzi wartość zero; w tym przypadku program wykonywany w µC węzła IoT.

    Przed dodaniem do tekstu przechowywanego w $consulta_sql z którego składa się zamówienie SQL wysyłane do serwera bazy danych, informacje otrzymane w zmiennych żądania POST są co najmniej wstępnie przetwarzane, aby uniknąć ataku ze strony Wstrzyknięcie SQL. W poprzednim przykładzie wymuszona jest konwersja na odpowiedni typ danych (int) (liczba całkowita) lub (float) (zmiennoprzecinkowy dziesiętny), co wystarczyłoby do wyeliminowania ewentualnego złośliwego kodu dodanego do danych żądania przez serwer internetowy.

    Jak widać, w Język PHP Symbol kropki (.) służy do łączenia tekstów tworzących porządek SQL lub operator kropki i znaku równości (.=), aby dodać tekst na prawo od tego, który już przechowuje zmienną, a pojedynczy cudzysłów (') jest również używany do ujęcia stałych tekstowych, a nie tylko znaków. Chociaż w tym przypadku można również użyć podwójnych cudzysłowów («), in Język PHP służą do przetwarzania treści, np. włączania zmiennych w tekście w formacie $texto="Me llamo $nombre"; jako alternatywa dla formatu $texto='Me llamo '.$nombre; pozwala także na dołączanie cudzysłowów jednego typu do drugiego bez konieczności używania znaków ucieczki, gdy liczby podwójne występują naprzemiennie w obrębie pojedynczych lub pojedynczych w obrębie podwójnych, jak w przypisaniu $texto='esto no hay que "escaparlo" en PHP';.

    Aby wykonać zapytanie do serwera MySQL funkcja jest używana mysqli_query z formatem mysqli_query($conexion,$consulta_sql) który przyjmuje jako parametry połączenie obiektu z bazą danych oraz tekst zamówienia SQL który został skomponowany.

    Funkcja mysqli_query($conexion,$consulta_sql) zwraca obiekt kursora, którego można użyć do przechodzenia przez zwrócone dane, jeśli ma to zastosowanie, lub, jak w powyższym przykładzie, do uzyskania informacji o operacji, w szczególności do poznania indeksu przypisanego do nowego rekordu, który operacja utworzyła w tabeli " grzejniki” z funkcją mysqli_insert_id($conexion)

    Wartość zwrócona przez mysqli_query($conexion,$consulta_sql) może uzyskać wartość false w operacji logicznej, aby określić, że wystąpił błąd. W poprzednim przykładzie służy do zwrócenia, podobnie jak w przypadku błędu połączenia, zera do aplikacji wysyłającej żądanie POST. W ten sposób program zwróci liczbę większą od zera, która reprezentuje indeks nowego rekordu, jeśli operacja jest poprawna, lub zero, jeśli operacja zakończy się błędem.

    Aby zwolnić zasoby przypisane do połączenia z bazą danych, należy je „zamknąć” za pomocą funkcji mysqli_close($conexion)

    Odczytaj informacje z bazy danych

    Z wyjątkiem architektur dla przetwarzanie mgły Większość węzłów IoT ogranicza się do wysyłania informacji przechwyconych przez ich czujniki do serwera, czyli tzw serwer internetowy Komunikuje się z nimi jedynie w celu przechowywania informacji, więc w poprzednim przykładzie znaczna część przypadków, które pojawią się w tej aplikacji, została już rozwiązana. Kolejnym krokiem mogłoby być stworzenie strony internetowej prezentującej dane monitorowane przez urządzenia podłączone do Internetu Rzeczy nakładka co wykracza poza tematykę omówioną w tej serii samouczków.

    Może się zdarzyć, że węzeł IoT ma pewną interaktywność i zachowuje się inaczej w oparciu o dane historyczne lub przewiduje możliwość zmiany swojego zachowania zgodnie z konfiguracją otrzymaną z serwera lub nawet węzeł jest ekranem wyświetlającym wykres z danymi, które były ostatnio monitorowane, w porównaniu z danymi zebranymi w poprzednich terminach. We wszystkich tych sytuacjach interesująca jest również możliwość odczytu danych z serwera MySQL przez serwer internetowy jak pokazano na poniższym przykładzie symulującym uzyskanie zestawienia dat stanów alarmowych określonych momentami, w których temperatura przekroczyła 40°C

    W powyższym przykładzie do wykonania zapytania do bazy danych użyto komendy SQL SELECT zgodnie z podstawowym formatem SELECT campos FROM tabla WHERE condición ORDER BY campo DESC z jedyną osobliwością polegającą na dodaniu funkcji do pola daty DAY, MONTH, YEAR y TIME w celu uzyskania oddzielnie dnia, numeru miesiąca, roku i godziny. Warunek jest taki, aby temperatura była większa od 40.0 i była porządkowana przy użyciu pola daty od najwyższej (najbardziej aktualnej) do najniższej (najstarsza) wskazując ją klauzulą DESC

    Aby zapętlić wartości zwrócone przez zapytanie z pętli for przy znanym wymiarze używana jest funkcja mysqli_num_rows($resultado) który wskazuje liczbę znalezionych rekordów. Z funkcją mysqli_data_seek($resultado,$numero_resultado) kursor wyników można przesunąć do określonej pozycji wyrażonej przez licznik pętli for, $numero_resultado, w przykładzie.

    Do zapisania w wektorze pól rekordu wskazywanych przez kursor wynikowy służy funkcja mysqli_fetch_row($resultado) który jest przypisany do zmiennej $registro które później zostaną użyte do utworzenia frazy z różnymi wartościami, uzyskując do nich dostęp poprzez ich indeksy.

    Po przekroczeniu wszystkich wartości zasoby przypisane do wyniku zapytania zostają zwolnione SQL z funkcją mysqli_free_result($resultado)

    Przetwarzaj informacje z bazy danych. Porównaj wartości.

    W niektórych przypadkach wygodnie jest scentralizować przetwarzanie informacji na serwerze, nawet jeśli można to zrobić w węzłach IoT w stylu przetwarzanie mgły. W poniższym przykładzie symulowane są powody takiego działania: bezpieczeństwo; Węzeł ma informację o swoim kluczu (zamku) i o żądaniu (kluczu), ale nie wie, czy wypada ustąpić kombinacji obu, więc musi skonsultować się z serwerem, który podejmuje decyzję i informuje węzeł, odpowiadając zero (w celu wskazania nieudanego porównania) lub jeden (w celu wskazania, że ​​porównanie powiodło się) w oparciu o wynik zapytania do bazy danych.

    Pod tym pretekstem można zobaczyć przykład, w którym z urządzenia podłączonego do Internetu Rzeczy pobierane są dane (kod klucza i kod blokady), zwracany jest wynik (jeden lub zero w zależności od tego, czy wynik jest prawdziwy, czy fałszywy) i dokonywana jest niewielka obróbka informacji polegająca na porównaniu wyników uzyskanych podczas przeglądania bazy danych z wynikami przesłanymi przez węzeł IoT.

    W poprzednim przykładzie funkcja hexdec służy do uzyskania liczby dziesiętnej z tekstu reprezentującego liczbę szesnastkową i wysyłanego przez urządzenie IoT. Dodatkową zaletą korzystania z tej funkcji jest uniknięcie, jak wyjaśniono wcześniej, ataku polegającego na dodaniu kodu SQL złośliwy dla danych żądania POST.

    Zamieść komentarz

    Być może przegapiłeś