環境センサー「BME280」の取得した温湿度・気圧データを、データベース「MySQL」にタイムスタンプを付与して保存します。言語はPHPを使用します。BME280からのデータは、インタフェース「json」により、「{“temperature”:111, “humidity”:345 , “pressure”:678}」の形式で、一定時間ごとにサーバに送信され、MySQL への接続用の API 「PDO」を用いて保存します。PHP には、MySQL への接続用の API が、mysql、mysqli、PDOの三種類あります。mysqlは非推奨となっており、今回はPDOを使用します。PDOには次の特徴があります。

  • データベースが違っても、同じ方法で扱える。
  • ライブラリ自体が例外を通知してくれる。

今回作成したデータベースの構造を次に示します。受け取った環境データにタイムスタンプを付与してテーブル「sensor」に保存します。

MySQLテーブル「sensor」

環境データ保存テーブル

センサーからの環境データは、postの本文にjson形式で設定されており、「file_get_contents(‘php://input’)」により受け取ります。受け取った環境データは、json_decode関数によりデコードします。環境データを受信した時間をdate関数で取得して、タイムスタンプとし、温湿度・気圧データと共にsensorに保存します。書き込みプログラム「WriteDB.php」を次に示します。
また、例外が発生しない場合、例えば、「$stmt->execute」を実行したときに、戻り値がfalseになったが、例外が発生しませんできた。このようなときに、DB接続時の第四引数に「array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))」を追加すると例外が発生します。

WriteDB.php

<?php
try {
	//print_r(getallheaders() );
	$post_body = file_get_contents('php://input');
	//echo "body".$post_body;

	//$post_body = '{"temperature":111, "humidity":345 , "pressure":678}';

	$obj = json_decode($post_body);
	if ($obj === NULL) return;
	//var_dump($obj);

	$pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1','dbuser', 'dbpass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

	date_default_timezone_set('Asia/Tokyo');
	$date = date("Y/m/d G:i:s");
	$temperature = $obj->{'temperature'}; 
	$humidity = $obj -> {"humidity"};
	$pressure = $obj -> {"pressure"};

	$sql = "INSERT INTO sensor  VALUES(:date,:temperature,:humidity,:pressure)";
	$stmt = $pdo->prepare($sql);
	$stmt->bindValue(':date',$date, PDO::PARAM_STR);
	$stmt->bindParam(':temperature', $temperature, PDO::PARAM_INT);
	$stmt->bindValue(':humidity',$humidity,PDO::PARAM_INT);
	$stmt->bindValue(':pressure',$pressure,PDO::PARAM_INT);
	$res = $stmt->execute();

} catch (PDOException $e){
    var_dump($e->getMessage());
}
?>
次のinsert文を使うと、execute()で対応するデータ項目がないという例外が発生しました。現在は、上記に示すように「(date,temperature,humidity,pressure)」 の部分は削除しています。
“INSERT INTO sensor(date,temperature,humidity,pressure) VALUES(:date,:temperature,:humidity,:pressure)”

次にデータベースに保存した環境データを、読み出しプログラム「readDB.php」で読み出します。

readDB.php

<?php

try {

    $pdo = new PDO('mysql:dbname=testdb;host=127.0.0.1','dbuser', 'dbpass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

    $stmt = $pdo->query("SELECT * FROM sensor");

    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    echo "date:" . $row['date']." "."temperature:" . $row['temperature']." "."humidity:" . row['humidity']." "."pressure:" . $row['pressure']."\n ";
    }
} catch(PDOException $e){
    var_dump($e->getMessage());
}

$pdo = null;
?>