Accéder à la base de données depuis le langage de programmation PHP

Accéder à la base de données depuis le langage de programmation PHP

Accéder à la base de données depuis le langage de programmation PHP

Table des matières

    Serveur Web IdOServeur Web IoT HTTP POSTBase de données MySQL. Serveur Web IdOServeur Web IoT en langage PHP

    Dans ce dernier article de la série sur le Utiliser un serveur Web pour stocker les données des appareils connectés à l'Internet des objets, explique comment enregistrer dans une base de données MySQL les informations que les nœuds IoT envoient au serveur effectuant des requêtes HTTP POST. Les lecteurs de cet article, ainsi que de l'ensemble du blog, ne sont peut-être pas particulièrement familiers avec la programmation dans le Langage PHP mais sûrement oui avec la programmation de microcontrôleurs en langues C o C + + ainsi, à l'exception de quelques détails, comme faire précéder le signe dollar ($) des variables, vous pourrez suivre les exemples sans avoir besoin d'explications supplémentaires puisqu'ils ont été réalisés selon un style de programmation très neutre, non spécifique à PHP.

    Stocker les informations dans la base de données

    Comme expliqué dans l'article sur le Stockage de données IoT en effectuant des requêtes HTTP POST vers un serveur Web, à la fin des en-têtes, le corps de la requête POST contient les données qui sont envoyées au serveur. Le moyen le plus courant d'envoyer ces informations au serveur est au format texte brut, car il est plus facile de les analyser, même « manuellement ». Lorsque les données envoyées au serveur sont complexes, il sera sûrement commode de les structurer en utilisant par exemple le format XML o JSON. Dans l'utilisation habituelle d'un serveur Web pour gérer les informations des appareils connectés à l'Internet des objets, il n'est pas courant d'avoir besoin d'une structure de données, il est donc normal de les envoyer en texte brut au format variable=valor.

    Dans la requête HTTP POST de l'exemple suivant, la ressource (normalement une page Web) /iot/grabar_temperatura est demandée au serveur polaridad.es et trois variables sont envoyées : ne, tp et cr, qui contiennent respectivement les valeurs " 12", "10.26 » et « 2.18 » Il est également important de rappeler qu'il existe une ligne vierge pour séparer les en-têtes des données.

    Le but final du code suivant PHP enverra au serveur de base de données MySQL l'ordre SQL:

    Avec lequel un nouvel enregistrement sera créé (INSERT)
    dans la base de données chauffage (INTO calefacciones)
    attribution à des champs (numero_estancia,temperatura,corriente)
    les valeurs correspondant à la requête HTTP POST VALUES (12, 10.26, 2.18)

    La connexion à la base de données se fait avec la fonction mysqli_connect selon le format : mysqli_connect($servidor,$usuario,$clave,$base_datos) qui renvoie un pointeur vers l'objet de connexion et qui utilise les variables qui définissent l'accès (telles que l'utilisateur, le mot de passe...) et qui ont été préalablement affectées pour de futures utilisations hypothétiques dans le script.

    Pour détecter si la connexion a réussi, la fonction est utilisée mysqli_connect_errno() qui renvoie le numéro d'erreur qui a pu se produire ou zéro (faux) si la connexion a été établie correctement. Pour notifier les erreurs, l'application qui effectue la requête HTTP reçoit une réponse avec une valeur de zéro, dans ce cas le programme qui est exécuté dans le µC du nœud IoT.

    Avant d'ajouter au texte stocké dans $consulta_sql avec lequel la commande est composée SQL qui est envoyée au serveur de base de données, les informations arrivées dans les variables de la requête POST sont prétraitées, au minimum, pour éviter une attaque par Injection SQL. Dans l'exemple précédent, la conversion vers le type de données correspondant est forcée (int) (entier) ou (float) (décimal à virgule flottante) ce qui suffirait à éliminer un éventuel code malveillant ajouté aux données de la requête par serveur web.

    Comme on peut le voir, dans le Langage PHP Le symbole point (.) est utilisé pour concaténer les textes qui forment la commande SQL ou le point et l'opérateur de signe égal (.=) pour ajouter du texte à droite de celui qui stocke déjà une variable et le guillemet simple (') est également utilisé pour encadrer des constantes de texte, pas seulement des caractères. Bien que dans ce cas des guillemets doubles («) puissent également être utilisés, dans Langage PHP sont utilisés pour traiter le contenu, par exemple, en incluant des variables dans le texte au format $texto="Me llamo $nombre"; comme alternative au format $texto='Me llamo '.$nombre; vous permettant également d'inclure des guillemets d'un type dans un autre sans avoir à utiliser des signes d'échappement chaque fois que des doubles alternent dans des simples ou des simples dans des doubles comme dans l'affectation $texto='esto no hay que "escaparlo" en PHP';.

    Pour exécuter la requête sur le serveur MySQL la fonction est utilisée mysqli_query avec le format mysqli_query($conexion,$consulta_sql) qui prend comme paramètres la connexion de l'objet à la base de données et le texte avec la commande SQL qui a été composé.

    La fonction mysqli_query($conexion,$consulta_sql) renvoie un objet curseur qui peut être utilisé pour parcourir les données renvoyées le cas échéant ou, comme dans l'exemple ci-dessus, pour obtenir des informations sur l'opération, notamment pour connaître l'index attribué au nouvel enregistrement que l'opération a créé dans la table " radiateurs" avec la fonction mysqli_insert_id($conexion)

    La valeur renvoyée par mysqli_query($conexion,$consulta_sql) peut donner la valeur false dans une opération booléenne pour déterminer qu'une erreur s'est produite. Dans l'exemple précédent, il sert à renvoyer, comme dans le cas de l'erreur de connexion, un zéro à l'application qui fait la requête POST. De cette façon, le programme renverra un nombre supérieur à zéro qui représente l'index du nouvel enregistrement si l'opération est correcte ou un zéro si l'opération produit une erreur.

    Pour libérer les ressources qui ont été affectées à la connexion à la base de données, celle-ci est "fermée" à l'aide de la fonction mysqli_close($conexion)

    Lire les informations de la base de données

    Sauf dans les architectures pour informatique de brouillard La plupart des nœuds IoT se limitent à envoyer les informations capturées par leurs capteurs au serveur, c'est-à-dire le serveur web Il communique avec eux uniquement pour stocker les informations, donc avec l'exemple précédent une bonne partie des cas qui se présenteront dans cette application ont déjà été résolus. La prochaine étape pourrait être de créer un site Web présentant les données surveillées par les appareils connectés à l'Internet des objets, un travail de frontend ce qui est en dehors de ce qui est discuté dans cette série de tutoriels.

    Ce qui peut arriver, c'est qu'un nœud IoT ait une certaine interactivité et se comporte différemment en fonction de données historiques ou prévoit la possibilité de modifier son comportement en fonction d'une configuration qui lui vient d'un serveur ou même le nœud est un écran qui affiche un graphique avec les données qui ont été récemment surveillées par rapport à celles acquises aux dates précédentes. Pour toutes ces situations il est également intéressant de pouvoir lire les données du serveur MySQL à travers serveur web comme illustré dans l'exemple suivant qui simule l'obtention d'une liste des dates des états d'alarme déterminés par les moments où la température a dépassé 40°C

    Dans l'exemple ci-dessus, pour interroger la base de données, la commande est utilisée SQL SELECT selon le format de base SELECT campos FROM tabla WHERE condición ORDER BY campo DESC avec pour seule particularité d'ajouter les fonctions au champ date DAY, MONTH, YEAR y TIME afin d'obtenir séparément le jour, le numéro du mois, l'année et l'heure. La condition imposée est que la température soit supérieure à 40.0 et est classée en utilisant le champ de date du plus élevé (le plus actuel) au plus bas (le plus ancien) en l'indiquant avec la clause DESC

    Pour parcourir les valeurs renvoyées par la requête à partir d'une boucle for avec une dimension connue, la fonction est utilisée mysqli_num_rows($resultado) qui indique le nombre d'enregistrements trouvés. Avec la fonction mysqli_data_seek($resultado,$numero_resultado) le curseur des résultats peut être déplacé vers une position spécifique exprimée par le compteur de boucles for, $numero_resultado, dans l'exemple.

    Pour stocker dans un vecteur les champs de l'enregistrement pointés par le curseur résultat, on utilise la fonction mysqli_fetch_row($resultado) qui est affecté à la variable $registro qui sera ensuite utilisé pour former une phrase avec les différentes valeurs, en y accédant par leurs index.

    Une fois toutes les valeurs parcourues, les ressources affectées au résultat de la requête sont libérées SQL avec fonction mysqli_free_result($resultado)

    Traiter les informations de la base de données. Comparez les valeurs.

    Dans certaines occasions, il est pratique que le traitement de l'information soit centralisé sur le serveur même s'il était possible de le faire dans les nœuds IoT dans le style informatique de brouillard. Dans l'exemple suivant, les raisons simulées pour cela sont la sécurité ; Le nœud a des informations sur sa clé (serrure) et sur une requête (clé) mais ne sait pas s'il est approprié de céder à la combinaison des deux, il doit donc consulter le serveur, qui est celui qui prend la décision et informe le nœud en répondant zéro (pour indiquer une comparaison échouée) ou un (pour indiquer que la comparaison a réussi) en fonction du résultat d'une requête adressée à votre base de données.

    Avec cette excuse, vous pouvez voir un exemple dans lequel des données sont reçues de l'appareil connecté à l'Internet des objets (un code clé et un code de verrouillage), un résultat est renvoyé (un ou zéro selon que le résultat est vrai ou faux) et un petit traitement de l'information est effectué consistant à comparer les résultats obtenus lors de la consultation de la base de données avec ceux envoyés par le nœud IoT.

    Dans l'exemple précédent, la fonction hexdec est utilisée pour obtenir un nombre décimal à partir d'un texte qui représente un nombre hexadécimal et est celui envoyé par l'appareil IoT. L'avantage supplémentaire de l'utilisation de cette fonction est d'éviter, comme expliqué précédemment, une attaque par ajout de code SQL malveillant pour les données de la requête POST.

    Poster un commentaire

    Vous avez peut-être manqué