Juurdepääs andmebaasile PHP programmeerimiskeelest
Selles sarja viimases artiklis teemal Veebiserveri kasutamine asjade Internetiga ühendatud seadmete andmete salvestamiseks, selgitab, kuidas andmebaasi salvestada MySQL teave, mille IoT-sõlmed saadavad serverile, mis teeb HTTP POST-päringuid. Selle artikli ja kogu ajaveebi lugejad ei pruugi olla programmide programmeerimisega eriti kursis PHP keel aga programmeerimisega kindlasti jah mikrokontrollerid keeltes C o C + + nii et, välja arvatud mõned üksikasjad, nagu näiteks dollarimärgi ($) eelmine muutujatele, saate näiteid järgida ilma täiendavate selgitusteta, kuna need on tehtud väga neutraalse programmeerimisstiili järgi, mis ei ole spetsiifiline PHP.
Salvestage teave andmebaasis
Nagu on selgitatud artiklis teemal IoT andmete salvestamine, tehes veebiserverisse HTTP POST-päringuid, POST-päringu sisu sisaldab päiste lõpus andmeid, mis saadetakse serverisse. Kõige tavalisem viis selle teabe serverisse saatmiseks on lihttekstivormingus, kuna seda on lihtsam isegi "käsitsi" analüüsida. Kui serverisse saadetavad andmed on keerulised, on neid kindlasti mugav struktureerida, kasutades näiteks vormingut XML o JSON. Tavapärasel veebiserveri kasutamisel asjade Internetiga ühendatud seadmete teabe haldamiseks ei ole andmestruktuur vajalik, seega on tavaline saata need lihttekstina vormingus. variable=valor
.
Järgmise näite HTTP POST päringus küsitakse polaridad.es serverilt ressurssi (tavaliselt veebilehte) /iot/grabar_temperatura ja saadetakse kolm muutujat: ne, tp ja cr, mis sisaldavad vastavalt väärtusi " 12", "10.26 » ja «2.18» Samuti on oluline meeles pidada, et päiste andmetest eraldamiseks on tühi rida.
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
Järgmise koodi lõppeesmärk PHP saadab andmebaasiserverisse MySQL korraldus 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
);
|
Millega luuakse uus kirje (INSERT
)
kütteandmebaasis (INTO
)calefacciones
väljadele määramine (numero_estancia,temperatura,corriente)
väärtused, mis vastavad HTTP POST-i päringule VALUES (12, 10.26, 2.18)
Ühendus andmebaasiga toimub funktsiooniga mysqli_connect
vastavalt vormingule: mysqli_connect($servidor,$usuario,$clave,$base_datos)
mis tagastab kursori ühendusobjektile ja kasutab muutujaid, mis määravad juurdepääsu (nt kasutajanimi, parool...) ja mis on skriptis edaspidiseks hüpoteetiliseks kasutamiseks määratud.
Ühenduse õnnestumise tuvastamiseks kasutatakse funktsiooni mysqli_connect_errno()
mis tagastab tekkida võinud vea numbri või nulli (väär), kui ühendus loodi õigesti. Vigadest teavitamiseks vastatakse HTTP päringu esitavale rakendusele väärtusega null, antud juhul programmile, mis käivitatakse µC IoT sõlmest.
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;
|
Enne salvestatud tekstile lisamist $consulta_sql
millega tellimus koostatakse SQL mis saadetakse andmebaasiserverisse, töödeldakse POST-i päringu muutujates saabunud infot vähemalt eeltöödeldud, et vältida rünnakut SQL-i süstimine. Eelmises näites on teisendamine vastavaks andmetüübiks sunnitud (int)
(täisarv) või (float)
(ujukoma kümnend), millest piisaks, et kõrvaldada võimalik pahatahtlik kood, mis on lisatud päringu andmetele veebiserver.
Nagu näha, on PHP keel Järjekorda moodustavate tekstide ühendamiseks kasutatakse perioodi sümbolit (.). SQL või punkti ja võrdusmärgi operaatorit (.=), et lisada tekst paremale muutujast, mis juba salvestab, ja ühtset jutumärki (‘) kasutatakse ka tekstikonstantide, mitte ainult märkide lisamiseks. Kuigi sel juhul võib kasutada ka jutumärke («), siis sisse PHP keel kasutatakse näiteks sisu töötlemiseks, kaasates vormingusse muutujad teksti sees $texto="Me llamo $nombre";
alternatiivina vormingule $texto='Me llamo '.$nombre;
Samuti võimaldab teil lisada ühte tüüpi jutumärke teises ilma, et peaksite kasutama paomärke alati, kui duublid vahelduvad üksiksõnade sees või üksikud kahekohalistes, nagu ülesandes $texto='esto no hay que "escaparlo" en PHP';
.
Päringu täitmiseks serverisse MySQL funktsiooni kasutatakse mysqli_query
vorminguga mysqli_query($conexion,$consulta_sql)
mis võtab parameetritena objekti-ühenduse andmebaasiga ja teksti tellimusega SQL mis on koostatud.
Funktsioon mysqli_query($conexion,$consulta_sql)
tagastab kursoriobjekti, mida saab kasutada tagastatud andmete läbimiseks, kui see on asjakohane, või, nagu ülaltoodud näites, toimingu kohta teabe hankimiseks, täpsemalt selleks, et teada saada tabelisse operatsiooni loodud uuele kirjele määratud indeksit " küttekehad" funktsiooniga mysqli_insert_id($conexion)
Tagastatud väärtus mysqli_query($conexion,$consulta_sql)
saab anda tõeväärtusoperatsiooni väärtuseks Väär, et teha kindlaks, kas tõrge on ilmnenud. Eelmises näites kasutatakse seda POST-i päringu esitavale rakendusele nulli tagastamiseks, nagu ühenduse vea korral. Sel viisil tagastab programm nullist suurema arvu, mis tähistab uue kirje indeksit, kui toiming on õige, või nulli, kui toiming tekitab vea.
Andmebaasiühendusele määratud ressursside vabastamiseks "sulgetakse" see funktsiooni abil mysqli_close($conexion)
Lugege andmebaasist teavet
Välja arvatud arhitektuurides uduarvutus Enamik IoT-sõlmi piirdub oma andurite jäädvustatud teabe saatmisega serverisse, st veebiserver See suhtleb nendega ainult teabe salvestamiseks, nii et eelmise näite puhul on suur osa selles rakenduses esilekerkivatest juhtumitest juba lahendatud. Järgmise sammuna võiks luua veebilehe, mis näitab asjade internetti ühendatud seadmete jälgitavaid andmeid. frontend mis jääb väljapoole selles õpetuste sarjas käsitletavat.
Mis võib juhtuda, on see, et asjade Interneti-sõlm on teatud interaktiivsusega ja käitub ajalooliste andmete põhjal erinevalt või näeb ette võimaluse muuta oma käitumist vastavalt serverist saabuvale konfiguratsioonile või isegi sõlm on ekraan, mis näitab graafikut. andmetega, mida on hiljuti jälgitud võrreldes eelmistel kuupäevadel omandatud andmetega. Kõigi nende olukordade puhul on huvitav ka võimalus lugeda serverist andmeid MySQL läbi veebiserver nagu on illustreeritud järgmises näites, mis simuleerib häireseisundite kuupäevade loendi saamist, mis on määratud hetkedega, mil temperatuur ületas 40 °C
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);
}
|
Ülaltoodud näites kasutatakse andmebaasi päringu tegemiseks käsku SQL SELECT
vastavalt põhivormingule SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
ainsa eripäraga on funktsioonide lisamine kuupäevaväljale DAY
, MONTH
, YEAR
y TIME
selleks, et saada eraldi päev, kuu number, aasta ja kellaaeg. Kehtestatud tingimus on, et temperatuur on kõrgem kui 40.0 ja see on järjestatud kuupäevavälja abil kõrgeimast (kõige praegusest) madalaima (vanimani), mis näitab seda koos klausliga DESC
Päringu poolt tsüklist tagastatud väärtuste sirvimiseks for
teadaoleva mõõtmega funktsiooni kasutatakse mysqli_num_rows($resultado)
mis näitab leitud kirjete arvu. Funktsiooniga mysqli_data_seek($resultado,$numero_resultado)
tulemuste kursori saab liigutada tsükliloenduriga väljendatud kindlasse kohta for
, $numero_resultado
, näites.
Et salvestada vektorisse kirje väljad, millele tulemuse kursor osutab, kasutatakse funktsiooni mysqli_fetch_row($resultado)
mis on omistatud muutujale $registro
mida hiljem kasutatakse erinevate väärtustega fraasi moodustamiseks, pääsedes neile juurde nende indeksite kaudu.
Kui kõik väärtused on läbitud, vabastatakse päringu tulemusele määratud ressursid SQL funktsiooniga mysqli_free_result($resultado)
Andmebaasi teabe töötlemine. Võrrelge väärtusi.
Mõnel juhul on mugav teabetöötlust serverisse koondada isegi siis, kui seda oleks võimalik teha IoT sõlmedes stiilis uduarvutus. Järgmises näites on simuleeritud põhjused turvalisus; Sõlmel on teavet oma võtme (luku) ja päringu (võti) kohta, kuid ta ei tea, kas mõlema kombinatsioonile on sobilik teed anda, seega peab ta konsulteerima serveriga, kes teeb otsuse ja teavitab sõlme, vastates teie andmebaasi päringu tulemusele nulliga (ebaõnnestunud võrdluse tähistamiseks) või ühega (võrdluse õnnestumise näitamiseks).
Selle vabandusega näete näidet, kus asjade internetti ühendatud seadmest võetakse vastu andmeid (võtmekood ja lukukood), tagastatakse tulemus (üks või null, olenevalt tulemusest tõene või väär) ja toimub teabe väike töötlemine, mis seisneb andmebaasis tutvumisel saadud tulemuste võrdlemises asjade Interneti sõlme saadetud tulemustega.
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;
|
Eelmises näites kasutatakse kuueteistkümnendsüsteemi funktsiooni kuueteistkümnendarvu saamiseks tekstist, mis esindab kuueteistkümnendsüsteemi ja on IoT-seadme saadetud arv. Selle funktsiooni kasutamise lisaeelis on, nagu eelnevalt selgitatud, koodi lisamisega rünnaku vältimine SQL pahatahtlik POST-päringu andmete suhtes.
Postita kommentaar