I-access ang database mula sa PHP programming language
Sa huling artikulong ito sa serye sa Paggamit ng web server upang mag-imbak ng data mula sa mga device na nakakonekta sa Internet of Things, nagpapaliwanag kung paano mag-record sa isang database MySQL ang impormasyong ipinapadala ng mga IoT node sa server na gumagawa ng mga kahilingan sa HTTP POST. Ang mga mambabasa ng artikulong ito, ng buong blog, ay maaaring hindi partikular na pamilyar sa programming sa wika ng PHP ngunit tiyak na oo sa programming ng mga microcontroller sa mga wika C o C + + kaya, maliban sa ilang mga detalye, tulad ng nauuna sa dollar sign ($) sa mga variable, magagawa mong sundin ang mga halimbawa nang hindi nangangailangan ng karagdagang mga paliwanag dahil ginawa ang mga ito sa pagsunod sa isang napaka-neutral na istilo ng programming, hindi partikular sa PHP.
Mag-imbak ng impormasyon sa database
Gaya ng ipinaliwanag sa artikulo sa Imbakan ng data ng IoT sa pamamagitan ng paggawa ng mga kahilingan sa HTTP POST sa isang web server, sa dulo ng mga header, ang katawan ng kahilingan ng POST ay naglalaman ng data na ipinadala sa server. Ang pinakakaraniwang paraan upang ipadala ang impormasyong ito sa server ay nasa plain text na format dahil mas madaling suriin ito kahit na "manual." Kapag kumplikado ang data na ipinadala sa server, tiyak na magiging maginhawa ang istraktura nito gamit, halimbawa, ang format XML o JSON. Sa karaniwang paggamit ng isang web server upang pamahalaan ang impormasyon mula sa mga device na nakakonekta sa Internet of Things, hindi karaniwan ang nangangailangan ng istraktura ng data, kaya normal na ipadala ang mga ito sa plain text sa format. variable=valor
.
Sa HTTP POST na kahilingan ng sumusunod na halimbawa, ang mapagkukunan (karaniwang isang web page) /iot/grabar_temperatura ay hinihiling mula sa polaridad.es server at tatlong variable ang ipinadala: ne, tp at cr, na ayon sa pagkakabanggit ay naglalaman ng mga halaga " 12", "10.26 » at «2.18» Mahalaga ring tandaan na mayroong blangkong linya upang paghiwalayin ang mga header mula sa data.
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
Ang huling layunin ng sumusunod na code PHP ipapadala sa database server MySQL ang order 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
);
|
Kung saan lilikha ng bagong tala (INSERT
)
sa database ng pag-init (INTO
)calefacciones
pagtatalaga sa mga patlang (numero_estancia,temperatura,corriente)
ang mga halaga na tumutugma sa kahilingan ng HTTP POST VALUES (12, 10.26, 2.18)
Ang koneksyon sa database ay tapos na sa function mysqli_connect
ayon sa format: mysqli_connect($servidor,$usuario,$clave,$base_datos)
na nagbabalik ng pointer sa connection-object at na gumagamit ng mga variable na tumutukoy sa access (gaya ng user, password...) at na dati nang itinalaga para sa hinaharap na hypothetical na paggamit sa script.
Upang makita kung ang koneksyon ay matagumpay, ang function ay ginagamit mysqli_connect_errno()
na nagbabalik ng error number na maaaring naganap o zero (false) kung naitatag nang tama ang koneksyon. Upang ipaalam ang mga error, ang application na gumagawa ng kahilingan sa HTTP ay tinutugunan ng isang halaga na zero, sa kasong ito ang program na isinasagawa sa µC ng IoT node.
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;
|
Bago idagdag sa text na naka-store sa $consulta_sql
kung saan binubuo ang pagkakasunud-sunod SQL na ipinadala sa server ng database ang impormasyon na dumating sa mga variable ng kahilingan ng POST ay na-preprocess, sa pinakamababa, upang maiwasan ang pag-atake ng SQL injection. Sa nakaraang halimbawa, pinipilit ang conversion sa kaukulang uri ng data (int)
(integer) o (float)
(floating point decimal) na magiging sapat upang maalis ang posibleng malisyosong code na idinagdag sa data ng kahilingan ni web server.
Tulad ng makikita, sa wika ng PHP Ang simbolong tuldok (.) ay ginagamit upang pagdugtungin ang mga tekstong bumubuo sa ayos SQL o ang operator ng tuldok at equal sign (.=) upang magdagdag ng text sa kanan ng isa na nag-iimbak na ng variable at ang solong quote (‘) ay ginagamit din para ilakip ang mga constant ng text, hindi lang mga character. Bagama't sa kasong ito, ang dobleng panipi («) ay maaari ding gamitin, sa wika ng PHP ay ginagamit upang iproseso ang nilalaman, halimbawa, kabilang ang mga variable sa loob ng teksto sa format $texto="Me llamo $nombre";
bilang isang kahalili sa format $texto='Me llamo '.$nombre;
nagbibigay-daan din sa iyo na isama ang mga quote ng isang uri sa isa pa nang hindi kinakailangang gumamit ng mga escape sign sa tuwing ang mga double ay kahalili sa loob ng mga single o single sa loob ng doubles tulad ng sa assignment $texto='esto no hay que "escaparlo" en PHP';
.
Upang isagawa ang query sa server MySQL ginagamit ang function mysqli_query
kasama ang format mysqli_query($conexion,$consulta_sql)
na tumatagal bilang mga parameter ang object-koneksyon sa database at ang teksto na may pagkakasunud-sunod SQL na binubuo.
Ang pag-andar mysqli_query($conexion,$consulta_sql)
nagbabalik ng isang cursor-object na maaaring magamit upang lampasan ang ibinalik na data kung naaangkop o, tulad ng sa halimbawa sa itaas, upang makakuha ng impormasyon tungkol sa operasyon, partikular na malaman ang index na itinalaga sa bagong tala na ginawa ng operasyon sa talahanayan " heater" na may function mysqli_insert_id($conexion)
Ang halaga na ibinalik ni mysqli_query($conexion,$consulta_sql)
maaaring mag-evaluate sa false sa isang boolean operation upang matukoy na may naganap na error. Sa nakaraang halimbawa ito ay ginagamit upang bumalik, tulad ng sa kaso ng error sa koneksyon, isang zero sa application na gumagawa ng POST kahilingan. Sa ganitong paraan, magbabalik ang programa ng isang numerong mas malaki sa zero na kumakatawan sa index ng bagong record kung tama ang operasyon o isang zero kung ang operasyon ay gumagawa ng error.
Upang palayain ang mga mapagkukunan na itinalaga sa koneksyon sa database, ito ay "sarado" gamit ang function mysqli_close($conexion)
Basahin ang impormasyon mula sa database
Maliban sa mga arkitektura para sa fog computing Karamihan sa mga IoT node ay naglilimita sa kanilang sarili sa pagpapadala ng impormasyong nakuha ng kanilang mga sensor sa server, iyon ay, ang web server Nakikipag-ugnayan lamang ito sa kanila upang mag-imbak ng impormasyon, kaya sa nakaraang halimbawa isang magandang bahagi ng mga kaso na lalabas sa application na ito ay nalutas na. Ang susunod na hakbang ay maaaring lumikha ng isang website na nagpapakita ng data na sinusubaybayan ng mga device na konektado sa Internet of Things, isang gawa ng frontend na nasa labas ng tinatalakay sa seryeng ito ng mga tutorial.
Ang maaaring mangyari ay ang isang IoT node ay may isang partikular na interaktibidad at naiiba ang kilos batay sa isang makasaysayang data o nahuhulaan ang posibilidad na baguhin ang pag-uugali nito ayon sa isang configuration na darating dito mula sa isang server o kahit na ang node ay isang screen na nagpapakita ng isang graph kasama ang data na kamakailang sinusubaybayan kumpara sa nakuha sa mga nakaraang petsa. Para sa lahat ng mga sitwasyong ito ay kagiliw-giliw din na makapagbasa ng data mula sa server MySQL sa pamamagitan ng web server tulad ng inilalarawan sa sumusunod na halimbawa na ginagaya ang pagkuha ng isang listahan ng mga petsa ng mga estado ng alarma na tinutukoy ng mga sandali kung saan ang temperatura ay lumampas sa 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);
}
|
Sa halimbawa sa itaas, upang i-query ang database ang command ay ginagamit SQL SELECT
ayon sa pangunahing pormat SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
na may tanging kakaiba ng pagdaragdag ng mga function sa field ng petsa DAY
, MONTH
, YEAR
y TIME
upang makuha ang araw, ang bilang ng buwan, ang taon at ang oras nang hiwalay. Ang kundisyong ipinataw ay ang temperatura ay mas mataas sa 40.0 at iniutos gamit ang field ng petsa mula sa pinakamataas (pinakabago) hanggang sa pinakamababa (pinakaluma) na nagsasaad nito kasama ang sugnay. DESC
Upang i-loop ang mga halaga na ibinalik ng query mula sa isang loop for
na may kilalang dimensyon ang function ay ginagamit mysqli_num_rows($resultado)
na nagpapahiwatig ng bilang ng mga talaan na natagpuan. Gamit ang function mysqli_data_seek($resultado,$numero_resultado)
ang cursor ng mga resulta ay maaaring ilipat sa isang tiyak na posisyon na ipinahayag ng loop counter for
, $numero_resultado
, sa halimbawa.
Upang iimbak sa isang vector ang mga patlang ng rekord na itinuro ng cursor ng resulta, ginagamit ang function mysqli_fetch_row($resultado)
na itinalaga sa variable $registro
na sa kalaunan ay gagamitin upang bumuo ng isang parirala na may iba't ibang mga halaga, na ina-access ang mga ito sa pamamagitan ng kanilang mga index.
Kapag nalampasan na ang lahat ng mga halaga, ilalabas ang mga mapagkukunang itinalaga sa resulta ng query SQL may pagpapaandar mysqli_free_result($resultado)
Iproseso ang impormasyon mula sa database. Paghambingin ang mga halaga.
Sa ilang mga pagkakataon, maginhawa para sa pagpoproseso ng impormasyon na maging sentralisado sa server kahit na posible itong gawin sa mga IoT node sa istilo. fog computing. Sa sumusunod na halimbawa ang mga dahilan na ginagaya sa paggawa nito ay seguridad; Ang node ay may impormasyon tungkol sa susi nito (lock) at tungkol sa isang kahilingan (key) ngunit hindi alam kung angkop na magbigay daan sa kumbinasyon ng dalawa, kaya dapat itong kumunsulta sa server, na siyang gumagawa ng desisyon at nagpapaalam sa node sa pamamagitan ng pagtugon ng zero (upang ipahiwatig ang isang nabigong paghahambing) o isa (upang ipahiwatig na matagumpay ang paghahambing) batay sa resulta ng isang query sa iyong database.
Sa ganitong dahilan, makakakita ka ng isang halimbawa kung saan natatanggap ang data mula sa device na nakakonekta sa Internet of Things (isang key code at isang lock code), isang resulta ay ibinalik (isa o zero depende sa resulta kung totoo o mali) at ang isang maliit na pagproseso ng impormasyon ay isinasagawa na binubuo ng paghahambing ng mga resulta na nakuha kapag kumunsulta sa database sa mga ipinadala ng IoT node.
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;
|
Sa nakaraang halimbawa, ang hexdec function ay ginagamit upang makakuha ng decimal na numero mula sa isang text na kumakatawan sa isang hexadecimal na numero at ang ipinadala ng IoT device. Ang karagdagang bentahe ng paggamit ng function na ito ay upang maiwasan, tulad ng ipinaliwanag dati, ang isang pag-atake sa pamamagitan ng pagdaragdag ng code SQL nakakahamak sa data ng kahilingan sa POST.
Post Komento