Akses database dari bahasa pemrograman PHP
Dalam artikel terakhir dalam seri di Menggunakan server web untuk menyimpan data dari perangkat yang terhubung ke Internet of Things, menjelaskan cara merekam dalam database MySQL informasi yang dikirim node IoT ke server yang membuat permintaan HTTP POST. Pembaca artikel ini, dari keseluruhan blog, mungkin belum terlalu familiar dengan pemrograman di bahasa PHP tapi pastinya ya dengan pemrogramannya mikrokontroler dalam bahasa C o C + + jadi, kecuali untuk beberapa detail, seperti mendahului tanda dolar ($) pada variabel, Anda akan dapat mengikuti contoh tanpa memerlukan penjelasan lebih lanjut karena semuanya dilakukan dengan mengikuti gaya pemrograman yang sangat netral, tidak spesifik untuk PHP.
Menyimpan informasi dalam database
Seperti yang dijelaskan dalam artikel di Penyimpanan data IoT dengan membuat permintaan HTTP POST ke server web, di akhir header, isi permintaan POST berisi data yang dikirim ke server. Cara paling umum untuk mengirimkan informasi ini ke server adalah dalam format teks biasa karena lebih mudah untuk menganalisisnya bahkan "secara manual". Jika data yang dikirim ke server rumit, tentu akan lebih mudah untuk menyusunnya menggunakan, misalnya, format XML o JSON. Dalam penggunaan biasa server web untuk mengelola informasi dari perangkat yang terhubung ke Internet of Things, tidak umum diperlukan struktur data, jadi mengirimkannya dalam bentuk teks biasa dalam format adalah hal yang wajar. variable=valor
.
Dalam permintaan HTTP POST dari contoh berikut, sumber daya (biasanya halaman web) /iot/grabar_temperatura diminta dari server polaridad.es dan tiga variabel dikirim: ne, tp dan cr, yang masing-masing berisi nilai " 12", "10.26 » dan «2.18» Penting juga untuk diingat bahwa ada baris kosong untuk memisahkan header dari data.
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
Tujuan akhir dari kode berikut PHP akan dikirim ke server database MySQL pesanan 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
);
|
Dengan mana rekor baru akan dibuat (INSERT
)
dalam database pemanas (INTO
)calefacciones
menugaskan ke bidang (numero_estancia,temperatura,corriente)
nilai yang sesuai dengan permintaan HTTP POST VALUES (12, 10.26, 2.18)
Koneksi ke database dilakukan dengan fungsi tersebut mysqli_connect
menurut formatnya: mysqli_connect($servidor,$usuario,$clave,$base_datos)
yang mengembalikan pointer ke objek koneksi dan menggunakan variabel yang mendefinisikan akses (seperti pengguna, kata sandi...) dan yang sebelumnya telah ditetapkan untuk penggunaan hipotetis di masa depan dalam skrip.
Untuk mendeteksi apakah koneksi telah berhasil, fungsi tersebut digunakan mysqli_connect_errno()
yang mengembalikan nomor kesalahan yang mungkin terjadi atau nol (salah) jika koneksi dibuat dengan benar. Untuk memberitahukan kesalahan, aplikasi yang membuat permintaan HTTP direspon dengan nilai nol, dalam hal ini program yang dijalankan di mikroC dari simpul IoT.
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;
|
Sebelum menambahkan teks yang disimpan di $consulta_sql
dengan mana pesanan itu dibuat SQL yang dikirim ke server database, informasi yang telah tiba di variabel permintaan POST diproses terlebih dahulu, minimal, untuk menghindari serangan oleh injeksi SQL. Pada contoh sebelumnya, konversi ke tipe data yang sesuai dilakukan secara paksa (int)
(bilangan bulat) atau (float)
(titik desimal mengambang) yang cukup untuk menghilangkan kemungkinan kode berbahaya yang ditambahkan ke data permintaan web servidor.
Seperti yang bisa dilihat, di bahasa PHP Simbol titik (.) digunakan untuk menggabungkan teks-teks yang membentuk urutan SQL atau operator titik dan tanda sama dengan (.=) untuk menambahkan teks di sebelah kanan teks yang sudah menyimpan variabel dan tanda kutip tunggal (‘) juga digunakan untuk mengapit konstanta teks, bukan hanya karakter. Meskipun dalam hal ini tanda kutip ganda («) juga dapat digunakan, di bahasa PHP digunakan untuk memproses konten, misalnya, memasukkan variabel dalam teks dalam format $texto="Me llamo $nombre";
sebagai alternatif format $texto='Me llamo '.$nombre;
juga memungkinkan Anda untuk memasukkan tanda kutip dari satu jenis ke jenis lainnya tanpa harus menggunakan tanda escape setiap kali ganda bergantian dalam tunggal atau tunggal dalam ganda seperti dalam tugas $texto='esto no hay que "escaparlo" en PHP';
.
Untuk mengeksekusi query ke server MySQL fungsi digunakan mysqli_query
dengan format mysqli_query($conexion,$consulta_sql)
yang mengambil parameter koneksi objek ke database dan teks dengan pesanan SQL yang telah disusun.
Fungsi itu mysqli_query($conexion,$consulta_sql)
mengembalikan objek kursor yang dapat digunakan untuk melintasi data yang dikembalikan jika berlaku atau, seperti pada contoh di atas, untuk memperoleh informasi tentang operasi, khususnya untuk mengetahui indeks yang ditetapkan ke catatan baru yang telah dibuat oleh operasi dalam tabel " pemanas" dengan fungsinya mysqli_insert_id($conexion)
Nilai yang dikembalikan oleh mysqli_query($conexion,$consulta_sql)
dapat mengevaluasi ke false dalam operasi boolean untuk menentukan bahwa telah terjadi kesalahan. Pada contoh sebelumnya digunakan untuk mengembalikan, seperti dalam kasus kesalahan koneksi, angka nol ke aplikasi yang membuat permintaan POST. Dengan cara ini, program akan mengembalikan angka yang lebih besar dari nol yang mewakili indeks dari record baru jika operasinya benar atau nol jika operasi menghasilkan kesalahan.
Untuk mengosongkan sumber daya yang telah ditetapkan ke koneksi database, "ditutup" menggunakan fungsi tersebut mysqli_close($conexion)
Membaca informasi dari database
Kecuali dalam arsitektur untuk komputasi kabut Sebagian besar node IoT membatasi diri untuk mengirimkan informasi yang ditangkap oleh sensor mereka ke server, yaitu web servidor Itu hanya berkomunikasi dengan mereka untuk menyimpan informasi, jadi dengan contoh sebelumnya sebagian besar kasus yang akan muncul dalam aplikasi ini telah diselesaikan. Langkah selanjutnya adalah membuat situs web yang menampilkan data yang dipantau oleh perangkat yang terhubung ke Internet of Things, sebuah karya paling depan yang berada di luar apa yang dibahas dalam rangkaian tutorial ini.
Apa yang bisa terjadi adalah bahwa node IoT memiliki interaktivitas tertentu dan berperilaku berbeda berdasarkan data historis atau memperkirakan kemungkinan mengubah perilakunya sesuai dengan konfigurasi yang datang dari server atau bahkan node tersebut adalah layar yang menampilkan grafik. dengan data yang baru-baru ini dipantau dibandingkan dengan yang diperoleh pada tanggal sebelumnya. Untuk semua situasi ini, menarik juga untuk bisa membaca data dari server MySQL melalui web servidor seperti yang diilustrasikan dalam contoh berikut yang mensimulasikan perolehan daftar tanggal status alarm yang ditentukan oleh momen di mana suhu melebihi 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);
}
|
Pada contoh di atas, untuk menanyakan database digunakan perintah SQL SELECT
sesuai dengan format dasarnya SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
dengan satu-satunya kekhasan menambahkan fungsi ke bidang tanggal DAY
, MONTH
, YEAR
y TIME
untuk mendapatkan hari, nomor bulan, tahun dan waktu secara terpisah. Syarat yang diberlakukan adalah suhu lebih besar dari 40.0 dan diurutkan menggunakan kolom tanggal dari tertinggi (terkini) hingga terendah (terlama) yang ditunjukkan dengan klausa DESC
Untuk mengulang nilai yang dikembalikan oleh kueri dari sebuah loop for
dengan dimensi yang diketahui fungsi tersebut digunakan mysqli_num_rows($resultado)
yang menunjukkan jumlah record yang telah ditemukan. Dengan fungsinya mysqli_data_seek($resultado,$numero_resultado)
kursor hasil dapat dipindahkan ke posisi tertentu yang dinyatakan dengan penghitung loop for
, $numero_resultado
, dalam contoh.
Untuk menyimpan dalam vektor bidang rekaman yang ditunjuk oleh kursor hasil, fungsi ini digunakan mysqli_fetch_row($resultado)
yang ditugaskan ke variabel $registro
yang nantinya akan digunakan untuk membentuk frase dengan nilai yang berbeda, mengaksesnya berdasarkan indeksnya.
Setelah semua nilai dilintasi, sumber daya yang ditetapkan ke hasil kueri akan dilepaskan SQL dengan fungsi mysqli_free_result($resultado)
Memproses informasi dari database. Bandingkan nilai.
Pada beberapa kesempatan, akan lebih mudah jika pemrosesan informasi dipusatkan di server meskipun dimungkinkan untuk melakukannya di node IoT dengan gaya komputasi kabut. Dalam contoh berikut, alasan yang disimulasikan untuk melakukan hal tersebut adalah keamanan; Node memiliki informasi tentang kuncinya (kunci) dan tentang permintaan (kunci) tetapi tidak mengetahui apakah tepat untuk memberikan kombinasi keduanya, sehingga harus berkonsultasi dengan server, yang merupakan salah satu yang membuat keputusan dan memberi tahu node dengan merespons nol (untuk menunjukkan perbandingan yang gagal) atau satu (untuk menunjukkan bahwa perbandingan berhasil) berdasarkan hasil kueri ke database Anda.
Dengan alasan ini Anda dapat melihat contoh di mana data diterima dari perangkat yang terhubung ke Internet of Things (kode kunci dan kode kunci), hasilnya dikembalikan (satu atau nol tergantung pada hasilnya benar atau salah) dan sedikit pemrosesan informasi dilakukan yang terdiri dari membandingkan hasil yang diperoleh saat berkonsultasi dengan database dengan yang dikirim oleh node IoT.
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;
|
Pada contoh sebelumnya, fungsi hexdec digunakan untuk memperoleh angka desimal dari teks yang mewakili angka heksadesimal dan dikirim oleh perangkat IoT. Keuntungan tambahan menggunakan fungsi ini adalah menghindari, seperti dijelaskan sebelumnya, serangan dengan menambahkan kode SQL berbahaya terhadap data permintaan POST.
Posting