Az adatbázis elérése a PHP programozási nyelvből
A sorozat utolsó cikkében a Webszerver használata a tárgyak internetéhez csatlakoztatott eszközökről származó adatok tárolására, elmagyarázza, hogyan kell rögzíteni az adatbázisban MySQL az IoT-csomópontok által a HTTP POST kéréseket végző kiszolgálónak elküldött információk. Ennek a cikknek, az egész blognak az olvasói nem feltétlenül ismerik a programozást a PHP nyelv de a programozással biztosan igen mikrovezérlők nyelvekben C o C + + így néhány részlet kivételével, például a dollárjel ($) előtt a változók előtt, a példákat további magyarázat nélkül követheti, mivel nagyon semleges programozási stílust követve készültek, nem specifikusak PHP.
Tárolja az információkat az adatbázisban
Amint azt a cikkben kifejtettük IoT-adattárolás HTTP POST-kérések webszerver felé történő küldésével, a fejlécek végén a POST kérés törzse tartalmazza a szervernek küldött adatokat. Ennek az információnak a szervernek való elküldésének legáltalánosabb módja az egyszerű szöveges formátum, mivel egyszerűbb akár „kézi” elemzése is. Ha a szerverre küldött adatok összetettek, akkor biztosan kényelmes lesz azokat például a formátum használatával strukturálni XML o JSON. A dolgok internetére csatlakoztatott eszközökről származó információk kezelésére szolgáló webszerverek szokásos használatában nem gyakori, hogy szükség van adatszerkezetre, ezért normális, ha azokat egyszerű szövegben, a következő formátumban küldjük el. variable=valor
.
A következő példa HTTP POST kérésében a /iot/grabar_temperatura erőforrás (általában egy weboldal) lekérésre kerül a polaridad.es szervertől, és három változó kerül elküldésre: ne, tp és cr, amelyek rendre az értékeket tartalmazzák" 12", "10.26" és «2.18» Fontos megjegyezni, hogy van egy üres sor, amely elválasztja a fejléceket az adatoktól.
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
A következő kód végső célja PHP elküldi az adatbázis-kiszolgálónak MySQL a megrendelés SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
INSERT
INTO `calefacciones`
(
numero_estancia,
temperatura,
corriente
)
VALUES
(
12,
10.26,
2.18
);
|
mellyel új rekord jön létre (INSERT
)
a fűtési adatbázisban (INTO
)calefacciones
mezőkhöz való hozzárendelés (numero_estancia,temperatura,corriente)
a HTTP POST kérésnek megfelelő értékeket VALUES (12, 10.26, 2.18)
Az adatbázishoz való kapcsolódás a függvénnyel történik mysqli_connect
formátum szerint: mysqli_connect($servidor,$usuario,$clave,$base_datos)
amely egy mutatót ad vissza a kapcsolódási objektumhoz, és a hozzáférést meghatározó változókat (például felhasználó, jelszó...) használja, amelyeket korábban a szkriptben a jövőbeni hipotetikus felhasználásokhoz rendeltek hozzá.
A funkció segítségével megállapítható, hogy a kapcsolat sikeres volt-e mysqli_connect_errno()
amely visszaadja az esetlegesen előforduló hibaszámot vagy nullát (hamis), ha a kapcsolat megfelelően jött létre. A hibaértesítéshez a HTTP kérést küldő alkalmazás nulla értékkel válaszol, ebben az esetben az a program, amelyik a µC az IoT-csomópontról.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
$fin_linea=PHP_EOL;
$servidor=‘localhost’;
$usuario=‘pelaez’;
$clave=‘1234’;
$base_datos=‘base_datos_temperaturas’;
$conexion=mysqli_connect($servidor,$usuario,$clave,$base_datos);
if(mysqli_connect_errno())
{
echo 0; // Devolver el valor 0 para indicar que se ha producido un error
}
else
{
$numero_estancia=(int)$_POST[‘ne’];
$temperatura=(float)$_POST[‘tp’];
$corriente=(float)$_POST[‘cr’];
$consulta_sql =‘INSERT INTO calefacciones (numero_estancia,temperatura,corriente) ‘;
$consulta_sql.=‘VALUES (‘.$numero_estancia.‘,’.$temperatura.‘,’.$corriente.‘);’;
$resultado=mysqli_query($conexion,$consulta_sql);
if($resultado) // Si no se ha producido un error al realizar la consulta…
{
echo mysqli_insert_id($conexion); // Devolver el índice del nuevo registro (¡>0!)
}
else
{
echo 0; // Devolver el valor 0 para indicar que se ha producido un error
}
mysqli_close($conexion);
}
echo $fin_linea;
|
Mielőtt hozzáadna a tárolt szöveghez $consulta_sql
amellyel a rendet összeállítják SQL az adatbázis-kiszolgálónak elküldve a POST kérési változókban érkezett információkat legalább előfeldolgozásra kerül, hogy elkerüljük a SQL injekció. Az előző példában a megfelelő adattípusra való átalakítás kényszerített (int)
(egész) vagy (float)
(lebegőpontos tizedes), amely elegendő lenne a kérésadatokhoz hozzáadott esetleges rosszindulatú kódok eltávolításához szerver web.
Mint látható, a PHP nyelv A periódusszimbólum (.) a sorrendet alkotó szövegek összefűzésére szolgál SQL vagy a pont- és egyenlőségjel-operátor (.=) szöveget ad a már változót tároló változó jobb oldalára, és az egyetlen idézőjel (') szövegkonstansok bezárására is szolgál, nem csak karakterek közé. Bár ebben az esetben a kettős idézőjel («) is használható, in PHP nyelv A tartalom feldolgozására szolgálnak, például a szövegen belüli változókat a formátumba $texto="Me llamo $nombre";
a formátum alternatívájaként $texto='Me llamo '.$nombre;
lehetővé teszi az egyik típusú idézőjel beillesztését a másikba anélkül, hogy menekülő jeleket kellene használnia, amikor a duplák váltakoznak az egyesben, vagy az egyesek a kettősben, mint a feladatban $texto='esto no hay que "escaparlo" en PHP';
.
A lekérdezés végrehajtása a szerver felé MySQL funkciót használják mysqli_query
a formátummal mysqli_query($conexion,$consulta_sql)
amely paraméterként veszi az objektum-kapcsolatot az adatbázishoz és a szöveget a megrendeléssel SQL amely összeállításra került.
A funkció mysqli_query($conexion,$consulta_sql)
egy kurzorobjektumot ad vissza, amely adott esetben használható a visszaadott adatok bejárására, vagy a fenti példához hasonlóan a műveletről információk beszerzésére, különösen a művelet által a táblázatban létrehozott új rekordhoz rendelt index megismerésére " fűtőtestek" funkcióval mysqli_insert_id($conexion)
A visszaadott érték mysqli_query($conexion,$consulta_sql)
hamisra tud értékelni egy logikai műveletben annak megállapítására, hogy hiba történt. Az előző példában a POST kérést küldő alkalmazásnak nullát ad vissza, mint a kapcsolódási hiba esetén. Ily módon a program egy nullánál nagyobb számot ad vissza, amely az új rekord indexét jelenti, ha a művelet helyes, vagy egy nullát, ha a művelet hibát produkál.
Az adatbázis-kapcsolathoz rendelt erőforrások felszabadítása érdekében a kapcsolat „bezárásra kerül” a funkció segítségével mysqli_close($conexion)
Olvasson információkat az adatbázisból
Kivéve az architektúrákban köd számítástechnika A legtöbb IoT-csomópont arra korlátozódik, hogy az érzékelői által rögzített információkat elküldi a szervernek, azaz a szerver web Csak az információ tárolása érdekében kommunikál velük, így az előző példával az ebben az alkalmazásban felmerülő esetek jó része már megoldódott. A következő lépés egy olyan weboldal létrehozása lehet, amely a tárgyak internetéhez csatlakoztatott eszközök által megfigyelt adatokat jeleníti meg. frontend amely kívül esik az oktatóanyag-sorozatban tárgyaltakon.
Megtörténhet, hogy egy IoT-csomópont bizonyos interaktivitással rendelkezik, és másként viselkedik egy előzményadatok alapján, vagy előre látja annak lehetőségét, hogy megváltoztassa viselkedését a szerverről érkező konfiguráció szerint, vagy akár a csomópont egy grafikont megjelenítő képernyő. a közelmúltban megfigyelt adatokkal a korábbi dátumokhoz képest. Mindezen helyzetekben az is érdekes, hogy adatokat olvashatunk a szerverről MySQL keresztül szerver web a következő példában bemutatott módon, amely szimulálja a riasztási állapotok dátumainak listáját, amelyet azon pillanatok határoznak meg, amikor a hőmérséklet meghaladta a 40 °C-ot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
$fin_linea=PHP_EOL; // Fin de línea. Usar <br> para HTML si se va a mostrar la salida en algún tipo de pantalla o consola no es necesario
$servidor=‘localhost’;
$usuario=‘pelaez’;
$clave=‘1234’;
$base_datos=‘base_datos_temperaturas’;
$conexion=mysqli_connect($servidor,$usuario,$clave,$base_datos);
if(mysqli_connect_errno())
{
echo ‘Error al conectar a la base de datos: ‘ . mysqli_connect_error();
}
else
{
$consulta_sql=‘SELECT ‘;
$consulta_sql.=‘estancia, temperatura, DAY(fecha), MONTH(fecha), YEAR(fecha), TIME(fecha) ‘;
$consulta_sql.=‘FROM valor_temperaturas ‘;
$consulta_sql.=‘WHERE temperatura>40.0 ‘;
$consulta_sql.=‘ORDER BY fecha DESC;’;
$resultado=mysqli_query($conexion,$consulta_sql); // El tercer parámetro de mysqli_query, no usado, es el modo MYSQLI_STORE_RESULT por defecto o MYSQLI_USE_RESULT para grandes cantidades de datos
if($resultado) // Si no se ha producido un error al realizar la consulta
{
$total_resultado=mysqli_num_rows($resultado);
if($total_resultado) // Si se ha encontrado algún resultado
{
echo ‘Se han encontrado ‘.$total_resultado.‘ estados de alarma:’.$fin_linea;
for($numero_resultado=0;$numero_resultado<$total_resultado) // Recorrer los resultados
{
mysqli_data_seek($resultado,$numero_resultado); // Mover el cursor al registro correspondiente (no tendría por qué ser consecutivo)
$registro=mysqli_fetch_row($resultado); // Almacenar en un vector los datos del registro
echo ‘El ‘.$registro[2]; // Tercer campo de la consulta (día)
echo ‘ del ‘.$registro[3]; // Cuarto campo de la consulta (mes)
echo ‘ de ‘.$registro[4]; // Quinto campo de la consulta (año)
echo ‘ a las ‘.$registro[5]; // Sexto campo de la consulta (hora)
echo ‘ en la estancia “‘.$registro[0].‘”‘; // Primer campo de la consulta (estancia)
echo ‘ la temperatura superó el máximo de 40°C (‘.$registro[1].‘)’; // Segundo campo de la consulta (temperatura)
echo $fin_linea;
}
}
else
{
echo ‘No se ha encontrado ningún estado de alarma’.$fin_linea;
}
mysqli_free_result($resultado);
}
mysqli_close($conexion);
}
|
A fenti példában az adatbázis lekérdezéséhez a parancsot használjuk SQL SELECT
az alapformátum szerint SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
azzal az egyetlen különlegességgel, hogy a függvényeket hozzáadjuk a dátum mezőhöz DAY
, MONTH
, YEAR
y TIME
a nap, a hónap, az év és az idő külön-külön történő megszerzéséhez. A feltétel az, hogy a hőmérséklet nagyobb legyen 40.0-nál, és a dátum mezőben legyen rendezve a legmagasabbtól (legaktuálisabb) a legalacsonyabbig (legrégebbiig), a záradékkal jelezve. DESC
A lekérdezés által visszaadott értékek ciklusból való végigjátszása for
ismert mérettel a függvényt használjuk mysqli_num_rows($resultado)
amely a talált rekordok számát jelzi. A funkcióval mysqli_data_seek($resultado,$numero_resultado)
az eredmény kurzort a hurokszámláló által kifejezett meghatározott pozícióba lehet mozgatni for
, $numero_resultado
, a példában.
Az eredmény kurzor által mutatott rekord mezőinek vektorban való tárolásához a függvényt használjuk mysqli_fetch_row($resultado)
amely a változóhoz van rendelve $registro
amelyeket később a különböző értékeket tartalmazó kifejezések kialakítására használnak fel, és indexeik alapján érik el őket.
Miután az összes értéket bejárta, a lekérdezés eredményéhez rendelt erőforrások felszabadulnak SQL funkcióval mysqli_free_result($resultado)
Az adatbázisból származó információk feldolgozása. Hasonlítsa össze az értékeket.
Egyes esetekben kényelmes az információfeldolgozás központosítása a szerveren, még akkor is, ha ez az IoT csomópontokban lehetséges köd számítástechnika. A következő példában a szimulált okok a biztonság; A csomópont rendelkezik információval a kulcsáról (zárról) és egy kérésről (kulcsról), de nem tudja, hogy helyénvaló-e utat engedni a kettő kombinációjának, ezért konzultálnia kell a szerverrel, amely a döntést hozza és tájékoztatja a csomópontot úgy, hogy nullát (a sikertelen összehasonlítás jelzésére) vagy egyet (az összehasonlítás sikerességét jelezve) válaszol az adatbázis lekérdezésének eredménye alapján.
Ezzel a kifogással láthat egy példát, amelyben adat érkezik a tárgyak internetére csatlakoztatott eszközről (kulcskód és zárkód), és eredményt ad vissza (egy vagy nulla, attól függően, hogy az eredmény igaz vagy hamis), és Az információ egy kis feldolgozása az adatbázisban való lekérdezés során kapott eredmények és az IoT csomópont által küldött eredmények összehasonlításából áll.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
$fin_linea=PHP_EOL;
$servidor=‘localhost’;
$usuario=‘pelaez’;
$clave=‘1234’;
$base_datos=‘base_datos_puertas’;
$conexion=mysqli_connect($servidor,$usuario,$clave,$base_datos);
if(mysqli_connect_errno())
{
echo 0; // Devolver el valor 0 para indicar que la comparación no es válida o que se ha producido un error (en este caso es un error)
}
else
{
$cerradura=hexdec($_POST[“c”]);
$llave=hexdec($_POST[“l”]);
$consulta_sql=‘SELECT llave FROM cerraduras WHERE cerradura=”.$cerradura.“;’;
$resultado=mysqli_query($conexion,$consulta_sql);
if($resultado) // Si no se ha producido un error al realizar la consulta
{
$total_resultado=mysqli_num_rows($resultado);
if($total_resultado) // Si se ha encontrado algún resultado
{
$numero_resultado=0;
$buscando_cerradura=TRUE;
while($buscando_cerradura&&$numero_resultado<$total_resultado)
{
mysqli_data_seek($resultado,$numero_resultado);
$registro=mysqli_fetch_row($resultado);
if($registro[0]==$llave)
{
$buscando_cerradura=FALSE;
}
else
{
$numero_resultado++;
}
}
// echo !$buscando_cerradura;
if($buscando_cerradura)
{
echo 0; // Devolver el valor 0 para indicar que la comparación no es válida (o que se ha producido un error; y aquuí no es el caso)
}
else
{
echo 1; // Devolver el valor 1 para indicar que la comparación SÍ es válida
}
}
else
{
echo 0; // Devolver el valor 0 para indicar que la comparación no es válida o que se ha producido un error
}
}
else
{
echo 0; // Devolver el valor 0 para indicar que la comparación no es válida o que se ha producido un error
}
mysqli_close($conexion);
}
echo $fin_linea;
|
Az előző példában a hexdecimális függvény segítségével decimális számot kapunk egy hexadecimális számot képviselő szövegből, amelyet az IoT-eszköz küldött. A funkció használatának további előnye, hogy – amint azt korábban kifejtettük – elkerülhető a kód hozzáadásával történő támadás SQL rosszindulatú a POST kérés adataira.
Hozzászólás Comment