PHP プログラミング言語からデータベースにアクセスする
このシリーズの最後の記事では、 Web サーバーを使用して、モノのインターネットに接続されているデバイスからのデータを保存する、データベースに記録する方法を説明します。 MySQL IoT ノードが HTTP POST リクエストを行うサーバーに送信する情報。この記事やブログ全体の読者は、プログラミングについて特に詳しくないかもしれません。 PHP言語 しかし、プログラミングでは確かにそうです マイクロコントローラー 言語で C o C + + したがって、変数の前にドル記号 ($) を付けるなどの一部の詳細を除いて、これらの例は、特定のものではなく、非常に中立的なプログラミング スタイルに従って行われているため、これ以上の説明を必要とせずに従うことができます。 PHP.
情報をデータベースに保存する
の記事で説明したように、 Web サーバーに対して HTTP POST リクエストを行うことによる IoT データ ストレージヘッダーの最後にある POST リクエストの本文には、サーバーに送信されるデータが含まれています。この情報をサーバーに送信する最も一般的な方法は、「手動」でも分析しやすいプレーン テキスト形式です。サーバーに送信するデータが複雑な場合、次のような形式でデータを構造化すると便利です。 XML o JSONの。モノのインターネットに接続されたデバイスからの情報を管理するために Web サーバーを通常使用する場合、データ構造が必要になることは一般的ではないため、データ構造を次の形式のプレーンテキストで送信するのが通常です。 variable=valor
.
次の例の HTTP POST リクエストでは、リソース (通常は Web ページ) /iot/grabar_temperatura が Polaridad.es サーバーからリクエストされ、ne、tp、cr の 12 つの変数が送信されます。これらの変数にはそれぞれ値が含まれます。 10.26"、"2.18 »、および «XNUMX» ヘッダーとデータを区切るために空白行があることを覚えておくことも重要です。
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()
発生した可能性のあるエラー番号、または接続が正しく確立された場合はゼロ (false) を返します。エラーを通知するために、HTTP リクエストを行ったアプリケーションは値 XNUMX で応答します。この場合は、 μC 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;
|
に保存されているテキストに追加する前に $consulta_sql
注文を構成するもの SQL データベース サーバーに送信される POST リクエスト変数に到着した情報は、次のような攻撃を避けるために少なくとも前処理されます。 SQLインジェクション。前の例では、対応するデータ型への変換が強制されます。 (int)
(整数) または (float)
(浮動小数点 XNUMX 進数) これは、リクエスト データに追加される可能性のある悪意のあるコードを排除するのに十分です。 ウェブサーバー.
ご覧のとおり、 PHP言語 ピリオド記号 (.) は、注文を構成するテキストを連結するために使用されます。 SQL または、ドットと等号演算子 (.=) を使用して、すでに変数が格納されているものの右側にテキストを追加します。一重引用符 (‘) は、文字だけでなくテキスト定数を囲むためにも使用されます。この場合、二重引用符 («) も使用できますが、 PHP言語 コンテンツを処理するために使用されます。たとえば、次の形式のテキスト内の変数が含まれます。 $texto="Me llamo $nombre";
フォーマットの代替として $texto='Me llamo '.$nombre;
また、代入のように double が single 内で交互に配置されたり、single が double 内で配置されたりする場合でも、エスケープ記号を使用することなく、ある型の引用符を別の型の引用符に含めることができます。 $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 リクエストを行ったアプリケーションにゼロを返すために使用されます。このようにして、プログラムは、操作が正しい場合は新しいレコードのインデックスを表す XNUMX より大きい数値を返し、操作でエラーが発生した場合は XNUMX を返します。
データベース接続に割り当てられているリソースを解放するには、関数を使用してデータベース接続を「閉じます」 mysqli_close($conexion)
データベースから情報を読み取る
アーキテクチャを除いて フォグコンピューティング ほとんどの IoT ノードは、センサーによって捕捉された情報をサーバーに送信することに限定されています。 ウェブサーバー 情報を保存するために通信するだけなので、前の例では、このアプリケーションで発生するケースのかなりの部分がすでに解決されています。次のステップは、モノのインターネットに接続されたデバイスによって監視されるデータを表示する Web サイトを作成することです。 フロントエンド これは、この一連のチュートリアルで説明する内容の範囲外です。
起こり得るのは、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 ノードで実行できてもサーバーに集中させた方が便利な場合があります。 フォグコンピューティング。次の例では、そうする理由としてセキュリティがシミュレートされています。ノードはそのキー (ロック) とリクエスト (キー) に関する情報を持っていますが、両方の組み合わせに優先することが適切かどうかはわかりません。そのため、決定を行うサーバーに問い合わせる必要があります。データベースへのクエリの結果に基づいて、XNUMX (比較が失敗したことを示す) または XNUMX (比較が成功したことを示す) を応答してノードに通知します。
この言い訳を使用すると、モノのインターネットに接続されているデバイスからデータ (キー コードとロック コード) を受信し、結果 (結果が true または false に応じて XNUMX または XNUMX) が返され、データベースを参照したときに得られた結果と、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 デバイスによって送信された XNUMX 進数を表すテキストから XNUMX 進数を取得します。この関数を使用する追加の利点は、前に説明したように、コードを追加することによる攻撃を回避できることです。 SQL POST リクエストのデータに悪意のあるもの。
コメントを投稿