Доступ к базе данных с языка программирования PHP
В этой последней статье из серии о Использование веб-сервера для хранения данных с устройств, подключенных к Интернету вещей., объясняет, как записывать в базу данных MySQL информация, которую узлы IoT отправляют на сервер, выполняя HTTP-запросы POST. Читатели этой статьи и всего блога, возможно, не особо знакомы с программированием в язык PHP но, конечно, да, с программированием микроконтроллеры на языках C o C + + поэтому, за исключением некоторых деталей, таких как добавление знака доллара ($) перед переменными, вы сможете следовать примерам без необходимости дальнейших объяснений, поскольку они были выполнены в очень нейтральном стиле программирования, не специфичном для PHP.
Хранить информацию в базе данных
Как поясняется в статье о Хранение данных IoT путем отправки HTTP POST-запросов на веб-сервер.В конце заголовков тело запроса POST содержит данные, которые отправляются на сервер. Наиболее распространенный способ отправки этой информации на сервер — в текстовом формате, поскольку ее легче анализировать даже «вручную». Когда данные, отправляемые на сервер, сложны, их наверняка будет удобно структурировать, например, в формате XML o JSON. При обычном использовании веб-сервера для управления информацией с устройств, подключенных к Интернету вещей, структура данных не требуется, поэтому нормально отправлять их в виде обычного текста в формате variable=valor
.
В HTTP-запросе POST следующего примера ресурс (обычно веб-страница) /iot/grabar_temperatura запрашивается с сервера Polaridad.es и передаются три переменные: ne, tp и cr, которые соответственно содержат значения " 12», «10.26» и «2.18». Также важно помнить, что для отделения заголовков от данных имеется пустая строка.
1
2
3
4
|
POST /iot/grabar_temperatura HTTP/1.1
Host: polaridad.es
ne=12&tp=10.26&cr=2.18
|
Конечная цель следующего кода PHP отправлю на сервер базы данных MySQL заказ 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
);
|
С помощью которого будет создана новая запись (INSERT
)
в базе данных отопления (INTO
)calefacciones
присвоение полям (numero_estancia,temperatura,corriente)
значения, соответствующие HTTP POST-запросу VALUES (12, 10.26, 2.18)
Подключение к базе данных осуществляется с помощью функции mysqli_connect
по формату: mysqli_connect($servidor,$usuario,$clave,$base_datos)
который возвращает указатель на объект соединения и использует переменные, определяющие доступ (например, пользователь, пароль...) и которые были ранее назначены для будущего гипотетического использования в сценарии.
Чтобы определить, было ли соединение успешным, используется функция mysqli_connect_errno()
который возвращает номер ошибки, которая могла произойти, или ноль (ложь), если соединение было установлено правильно. Чтобы уведомить об ошибках, приложению, выполняющему HTTP-запрос, возвращается нулевое значение, в данном случае программе, которая выполняется в мкКл узла Интернета вещей.
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;
|
Прежде чем добавлять текст, хранящийся в $consulta_sql
с помощью чего составлен заказ SQL отправляется на сервер базы данных. Информация, поступившая в переменные запроса POST, предварительно обрабатывается, как минимум, во избежание атаки со стороны SQL-инъекция. В предыдущем примере преобразование в соответствующий тип данных принудительное. (int)
(целое число) или (float)
(десятичное число с плавающей запятой), чего было бы достаточно для устранения возможного вредоносного кода, добавленного в данные запроса с помощью веб-сервер.
Как видно, в язык PHP Символ точки (.) используется для объединения текстов, образующих заказ. SQL или оператор точки и знака равенства (.=), чтобы добавить текст справа от того, в котором уже хранится переменная, а одинарная кавычка (') также используется для заключения текстовых констант, а не только символов. Хотя в этом случае также можно использовать двойные кавычки («)», в язык PHP используются для обработки контента, например, включения переменных внутри текста в формате $texto="Me llamo $nombre";
как альтернатива формату $texto='Me llamo '.$nombre;
также позволяет включать кавычки одного типа в другой без необходимости использования escape-знаков всякий раз, когда двойные чередуются внутри одинарных или одиночные внутри двойных, как в задании $texto='esto no hay que "escaparlo" en PHP';
.
Чтобы выполнить запрос к серверу MySQL используется функция mysqli_query
с форматом mysqli_query($conexion,$consulta_sql)
который принимает в качестве параметров объект-подключение к базе и текст с заказом SQL что было составлено.
Функция mysqli_query($conexion,$consulta_sql)
возвращает объект-курсор, который можно использовать для перемещения по возвращенным данным, если это применимо, или, как в примере выше, для получения информации об операции, в частности, чтобы узнать индекс, назначенный новой записи, которую операция создала в таблице " обогреватели» с функцией mysqli_insert_id($conexion)
Значение, возвращаемое mysqli_query($conexion,$consulta_sql)
может получить значение false в логической операции, чтобы определить, что произошла ошибка. В предыдущем примере он используется для возврата, как и в случае с ошибкой соединения, нуля приложению, выполняющему POST-запрос. Таким образом, программа вернет число больше нуля, которое представляет индекс новой записи, если операция верна, или ноль, если операция выдает ошибку.
Чтобы освободить ресурсы, назначенные соединению с базой данных, оно «закрывается» с помощью функции mysqli_close($conexion)
Чтение информации из базы данных
За исключением архитектур для вычисления тумана Большинство узлов Интернета вещей ограничиваются отправкой информации, полученной их датчиками, на сервер, то есть веб-сервер Он общается с ними только для хранения информации, поэтому с помощью предыдущего примера значительная часть случаев, которые возникнут в этом приложении, уже решена. Следующим шагом может стать создание веб-сайта, на котором будут показаны данные, отслеживаемые устройствами, подключенными к Интернету вещей. интерфейс что выходит за рамки того, что обсуждается в этой серии руководств.
Что может случиться, так это то, что узел IoT обладает определенной интерактивностью и ведет себя по-разному в зависимости от исторических данных или предвидит возможность изменения своего поведения в соответствии с конфигурацией, поступающей к нему с сервера, или даже узел представляет собой экран, на котором отображается график. с данными, которые недавно отслеживались, по сравнению с данными, полученными в предыдущие даты. Для всех этих ситуаций также интересно иметь возможность читать данные с сервера. MySQL через веб-сервер как показано в следующем примере, который моделирует получение списка дат состояний тревоги, определяемых моментами, когда температура превышала 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);
}
|
В приведенном выше примере для запроса к базе данных используется команда SQL SELECT
по основному формату SELECT campos FROM tabla WHERE condición ORDER BY campo DESC
с единственной особенностью добавления функций в поле даты DAY
, MONTH
, YEAR
y TIME
чтобы получить день, номер месяца, год и время отдельно. Наложенное условие состоит в том, что температура превышает 40.0 и упорядочивается с использованием поля даты от самой высокой (самой текущей) до самой низкой (самой старой), указывая это с помощью предложения DESC
Для перебора значений, возвращаемых запросом из цикла for
при известной размерности используется функция mysqli_num_rows($resultado)
который указывает количество найденных записей. С помощью функции mysqli_data_seek($resultado,$numero_resultado)
курсор результатов можно переместить в определенную позицию, выраженную счетчиком цикла for
, $numero_resultado
, в примере.
Для хранения в векторе полей записи, на которую указывает курсор результата, используется функция mysqli_fetch_row($resultado)
который присваивается переменной $registro
который позже будет использоваться для формирования фразы с различными значениями, получая к ним доступ по их индексам.
После прохождения всех значений ресурсы, назначенные результату запроса, освобождаются. SQL с функцией mysqli_free_result($resultado)
Обработка информации из базы данных. Сравните значения.
В некоторых случаях удобно, чтобы обработка информации была централизована на сервере, даже если бы это можно было сделать в узлах IoT в стиле вычисления тумана. В следующем примере моделируются причины такого поведения: безопасность; Узел имеет информацию о своем ключе (блокировке) и о запросе (ключе), но не знает, уместно ли использовать комбинацию того и другого, поэтому он должен проконсультироваться с сервером, который принимает решение и информирует узел, отвечая ноль (чтобы указать на неудачное сравнение) или один (чтобы указать, что сравнение было успешным) в зависимости от результата запроса к вашей базе данных.
Под этим оправданием вы можете увидеть пример, в котором данные принимаются от устройства, подключенного к Интернету вещей (код ключа и код блокировки), возвращается результат (единица или ноль в зависимости от того, является ли результат истинным или ложным) и осуществляется небольшая обработка информации, заключающаяся в сравнении результатов, полученных при обращении к базе данных, с результатами, отправленными узлом 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;
|
В предыдущем примере функция hexdec используется для получения десятичного числа из текста, который представляет собой шестнадцатеричное число и отправляется устройством IoT. Дополнительным преимуществом использования этой функции является возможность избежать, как объяснялось ранее, атаки путем добавления кода. SQL вредоносный для данных POST-запроса.
Оставить комментарий