Prisijunkite prie duomenų bazės iš PHP programavimo kalbos
Šiame paskutiniame serijos straipsnyje apie Žiniatinklio serverio naudojimas duomenims iš įrenginių, prijungtų prie daiktų interneto, saugoti, paaiškina, kaip įrašyti į duomenų bazę MySQL informacija, kurią IoT mazgai siunčia serveriui, pateikdami HTTP POST užklausas. Šio straipsnio ir viso tinklaraščio skaitytojai gali būti nelabai susipažinę su programavimu PHP kalba bet tikrai taip su programavimu mikrovaldikliai kalbomis C o C + + taigi, išskyrus kai kurias detales, pvz., prieš dolerio ženklą ($) prieš kintamuosius, galėsite vadovautis pavyzdžiais be papildomų paaiškinimų, nes jie buvo atlikti vadovaujantis labai neutraliu programavimo stiliumi, nesusijusiu su kintamaisiais. PHP.
Saugokite informaciją duomenų bazėje
Kaip paaiškinta straipsnyje apie IoT duomenų saugojimas teikiant HTTP POST užklausas žiniatinklio serveriui, antraštės pabaigoje, POST užklausos turinyje yra duomenys, kurie siunčiami į serverį. Dažniausias būdas siųsti šią informaciją į serverį yra paprasto teksto formatu, nes ją lengviau analizuoti net „rankiniu būdu“. Kai į serverį siunčiami duomenys yra sudėtingi, juos tikrai bus patogu struktūrizuoti naudojant, pavyzdžiui, formatą XML o JSON. Įprastai naudojant žiniatinklio serverį informacijai tvarkyti iš įrenginių, prijungtų prie daiktų interneto, nėra įprasta duomenų struktūros, todėl įprasta juos siųsti paprastu tekstu tokiu formatu. variable=valor
.
Šio pavyzdžio HTTP POST užklausoje iš polaridad.es serverio prašoma resurso (paprastai tinklalapio) /iot/grabar_temperatura ir siunčiami trys kintamieji: ne, tp ir cr, kuriuose atitinkamai yra reikšmės " 12“, „10.26 » ir «2.18» Taip pat svarbu atsiminti, kad yra tuščia eilutė, skirta antraštėms atskirti nuo duomenų.
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
Galutinis šio kodo tikslas PHP bus išsiųstas į duomenų bazės serverį MySQL įsakymas 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
);
|
Su kuriuo bus sukurtas naujas įrašas (INSERT
)
šildymo duomenų bazėje (INTO
)calefacciones
priskyrimas laukams (numero_estancia,temperatura,corriente)
reikšmės, atitinkančios HTTP POST užklausą VALUES (12, 10.26, 2.18)
Prisijungimas prie duomenų bazės atliekamas naudojant funkciją mysqli_connect
pagal formatą: mysqli_connect($servidor,$usuario,$clave,$base_datos)
kuris grąžina žymeklį į ryšio objektą ir naudoja kintamuosius, kurie apibrėžia prieigą (pvz., vartotojo vardą, slaptažodį...) ir kurie anksčiau buvo priskirti būsimiems hipotetiniams tikslams scenarijuje.
Norint nustatyti, ar ryšys buvo sėkmingas, naudojama funkcija mysqli_connect_errno()
kuris grąžina galimą įvykusios klaidos numerį arba nulį (klaidinga), jei ryšys buvo užmegztas teisingai. Norėdami pranešti apie klaidas, programa, kuri pateikia HTTP užklausą, atsako nuliu reikšme, šiuo atveju programa, kuri vykdoma µC IoT mazgo.
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;
|
Prieš pridėdami prie teksto, kuris yra saugomas $consulta_sql
su kuriuo sudaromas įsakymas SQL kuri siunčiama į duomenų bazės serverį, informacija, gauta į POST užklausos kintamuosius, yra iš anksto apdorojama, kad būtų išvengta atakos SQL injekcija. Ankstesniame pavyzdyje konvertavimas į atitinkamą duomenų tipą yra priverstinis (int)
(sveikasis skaičius) arba (float)
(slankiojo kablelio po kablelio), kurio pakaktų, kad būtų pašalintas galimas kenkėjiškas kodas, pridėtas prie užklausos duomenų interneto serveris.
Kaip matyti, PHP kalba Taško simbolis (.) naudojamas jungiant tekstus, kurie sudaro tvarką SQL arba taško ir lygybės ženklo operatorius (.=), kad pridėtumėte tekstą į dešinę nuo to, kuriame jau saugomas kintamasis, o viena kabutė (') taip pat naudojama teksto konstantoms, o ne tik simboliams, įtraukti. Nors šiuo atveju taip pat galima naudoti dvigubas kabutes («), in PHP kalba yra naudojami turiniui apdoroti, pavyzdžiui, įtraukiant kintamuosius į tekstą formatu $texto="Me llamo $nombre";
kaip alternatyva formatui $texto='Me llamo '.$nombre;
taip pat leidžia įtraukti vieno tipo kabutes į kitą, nenaudojant pabėgimo ženklų, kai dubliai kaitaliojasi pavieniuose arba viengubos dublikuose, kaip ir užduotyje $texto='esto no hay que "escaparlo" en PHP';
.
Norėdami vykdyti serverio užklausą MySQL funkcija naudojama mysqli_query
su formatu mysqli_query($conexion,$consulta_sql)
kuris kaip parametrus paima objekto ryšį su duomenų baze ir tekstą su tvarka SQL kuri buvo sudaryta.
Funkcija mysqli_query($conexion,$consulta_sql)
grąžina žymeklio objektą, kurį galima naudoti grąžinamiems duomenims pereiti, jei taikoma, arba, kaip aukščiau pateiktame pavyzdyje, gauti informacijos apie operaciją, konkrečiai norint žinoti indeksą, priskirtą naujam įrašui, kurį operacija sukūrė lentelėje " šildytuvai“ su funkcija mysqli_insert_id($conexion)
Grąžinta vertė mysqli_query($conexion,$consulta_sql)
gali įvertinti kaip false loginėje operacijoje, kad nustatytų, ar įvyko klaida. Ankstesniame pavyzdyje jis naudojamas norint grąžinti nulį programai, kuri pateikia POST užklausą, kaip ir ryšio klaidos atveju. Tokiu būdu programa grąžins skaičių, didesnį už nulį, kuris reiškia naujo įrašo indeksą, jei operacija teisinga, arba nulį, jei operacija sukelia klaidą.
Norint atlaisvinti išteklius, kurie buvo priskirti duomenų bazės ryšiui, jis „uždaromas“ naudojant funkciją mysqli_close($conexion)
Skaityti informaciją iš duomenų bazės
Išskyrus architektūras rūko skaičiavimas Dauguma daiktų interneto mazgų apsiriboja jutiklių užfiksuotos informacijos siuntimu į serverį, ty interneto serveris Su jais bendrauja tik tam, kad saugotų informaciją, todėl su ankstesniu pavyzdžiu jau buvo išspręsta nemaža dalis atvejų, kurie kils šioje programoje. Kitas žingsnis galėtų būti sukurti svetainę, kurioje būtų rodomi prie daiktų interneto prijungtų įrenginių stebimi duomenys. front kuri nepatenka į tai, kas aptariama šioje mokymo priemonių serijoje.
Gali atsitikti taip, kad daiktų interneto mazgas turi tam tikrą interaktyvumą ir elgiasi kitaip, remdamasis istoriniais duomenimis arba numato galimybę pakeisti savo elgesį pagal konfigūraciją, kuri jam ateina iš serverio, arba net mazgas yra ekranas, kuriame rodoma grafika. su duomenimis, kurie buvo neseniai stebimi, palyginti su gautais ankstesnėmis datomis. Visose šiose situacijose taip pat įdomu skaityti duomenis iš serverio MySQL per interneto serveris kaip parodyta toliau pateiktame pavyzdyje, kuris imituoja pavojaus būsenų datų, nustatytų pagal momentus, kai temperatūra viršijo 40°C, sąrašą.
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);
}
|
Aukščiau pateiktame pavyzdyje duomenų bazės užklausai naudojama komanda SQL SELECT
pagal pagrindinį formatą SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
su vieninteliu ypatumu – funkcijų įtraukimu į datos lauką DAY
, MONTH
, YEAR
y TIME
norėdami gauti atskirai dieną, mėnesio numerį, metus ir laiką. Reikalaujama, kad temperatūra būtų aukštesnė nei 40.0 ir būtų tvarkoma naudojant datos lauką nuo aukščiausios (dabartinės) iki žemiausios (seniausios), nurodant tai su sąlyga DESC
Norėdami peržiūrėti reikšmes, kurias užklausa grąžino iš kilpos for
su žinomu matmeniu funkcija naudojama mysqli_num_rows($resultado)
kuris nurodo rastų įrašų skaičių. Su funkcija mysqli_data_seek($resultado,$numero_resultado)
rezultatų žymeklį galima perkelti į konkrečią padėtį, išreikštą kilpų skaitikliu for
, $numero_resultado
, pavyzdyje.
Norint išsaugoti vektoriuje įrašo laukus, į kuriuos nukreipia rezultato žymeklis, naudojama funkcija mysqli_fetch_row($resultado)
kuris priskiriamas kintamajam $registro
kurios vėliau bus naudojamos formuojant frazę su skirtingomis reikšmėmis, pasiekiant jas pagal jų indeksus.
Kai visos reikšmės bus perkeltos, užklausos rezultatui priskirti ištekliai išleidžiami SQL su funkcija mysqli_free_result($resultado)
Apdorokite informaciją iš duomenų bazės. Palyginkite vertes.
Kai kuriais atvejais patogu informacijos apdorojimą centralizuoti serveryje, net jei tai būtų galima padaryti daiktų interneto mazguose tokiu stiliumi rūko skaičiavimas. Šiame pavyzdyje modeliuojamos priežastys, dėl kurių taip elgiamasi, yra saugumas; Mazgas turi informaciją apie savo raktą (užraktą) ir apie užklausą (raktą), bet nežino, ar tinkama duoti kelią abiejų deriniui, todėl jis turi konsultuotis su serveriu, kuris priima sprendimą ir informuoja mazgą atsakydamas nuliu (nurodydamas nepavykusį palyginimą) arba vienetą (nurodydamas, kad palyginimas buvo sėkmingas), remdamasis jūsų duomenų bazės užklausos rezultatu.
Su šiuo pasiteisinimu galite pamatyti pavyzdį, kuriame iš įrenginio, prijungto prie daiktų interneto, gaunami duomenys (rakto kodas ir užrakto kodas), grąžinamas rezultatas (vienas arba nulis, priklausomai nuo to, ar rezultatas teisingas ar klaidingas) ir atliekamas nedidelis informacijos apdorojimas, kurį sudaro duomenų bazėje gautų rezultatų palyginimas su daiktų interneto mazgo siunčiamais rezultatais.
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;
|
Ankstesniame pavyzdyje šešioliktainio skaičiaus funkcija naudojama norint gauti dešimtainį skaičių iš teksto, kuris reiškia šešioliktainį skaičių ir yra tas, kurį siunčia IoT įrenginys. Papildomas šios funkcijos naudojimo pranašumas yra tai, kad, kaip paaiškinta anksčiau, išvengiama atakos pridedant kodą SQL kenkia POST užklausos duomenims.
Rašyti komentarą