Доступ к базе данных с языка программирования 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-запроса.
Оставить комментарий