2025 年度 OSS リテラシ3 : WWW サーバとデータベースサーバの連動 (2)
はじめに
WWW サーバの受け取った情報を,PHP 言語で書かれたプログラムを介して, データベースに登録できるようにする.
WWW サーバとデータベースサーバの連動 (1) では GET メソッドで送られたデータをデータベースに保存できるようにしたので, 本ドキュメントでは POST メソッドで送られたデータをデータベースに保存できるようにする.
PHP スクリプトの利用
接続情報の設定 (再掲)
データベースに接続するための情報を用意し, それを PHP スクリプトで使うことにする. ファイルは自分自身と www-data グループ (Web サーバで使われるグループ) 以外からは閲覧できないようにしておく. HTTP からアクセスするためには, www-data ユーザもしくは www-data グループに閲覧許可をつけないといけない.
$ cd $ vi ~/db_info.php <?php $SERV="localhost"; $USER="iotex"; $PASS="<password>"; (パスワードを書く. "<" と ">" は削除すること) $DBNM="iotex"; ?> $ sudo chgrp www-data ~/db_info.php $ chmod 640 ~/db_info.php
スクリプトの作成
WWW サーバとデータベースサーバの連動 (1) の 課題で作った PHP スクリプト (~/public_html/monitoring.php) を改良して欲しい.
<?php
// 設定ファイル
require_once("****/db_info.php"); //ファイルパスの指定
//取得したデータ. GET と POST へ対応させる.
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$name = htmlspecialchars(***); //引数処理.HTTP GET メソッド利用.
$time = htmlspecialchars(***);
$temp = htmlspecialchars(***);
$ip = getenv("REMOTE_ADDR");
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
$data = json_decode(file_get_contents('php://input'), true);
if ($data) {
$name = $data['name'] ?? null;
$time = $data['time'] ?? null;
$temp = $data['temp'] ?? null;
$ip = getenv("REMOTE_ADDR");
} else {
echo "No data received\n";
}
}
// 以下略
?>
PHP 経由でのデータベースへのデータ入力.
上記の php スクリプトは http の GET メソッドを使って送られてきたデータをデータベースに格納するものとなっている. 例えば以下のように, monitoring.php の ? 以降に "変数名=値" を並べて ブラウザの URL 欄にコピペすれば, それを確かめることができる.
GET メソッドでデータを送る場合は以下のようになる.なお,IP と ユーザ名 (hogehoge) は自分のものに変更すること!
$ curl -X GET -u iotuser:iotpasswd "https://iot-XX.matsue-ct.ac.jp/~hogehoge/monitoring.php?temp=20.0&name=jxxxx&time=20231000200000" DATA > (jxxxx, 20231000200000, 20.0, 10.100.111.100)
POST メソッドでデータを送る場合は,JSON 形式でデータを送ることが多い. curl コマンドで送る場合は以下のようになる.
$ curl -X POST -u iotuser:iotpasswd https://iot-XX.matsue-ct.ac.jp/~hogehoge/monitoring.php -H "Content-Type: application/json" -d '{"name":"jxxxx", "time":"20231030150001", "temp":24.2}'
DATA > (jxxxx, 20231030150001, 24.2, 10.100.111.100)
なお,ブラウザ上に以下のように ERROR が出た場合は,db_info.php に書いたパスワードが 間違っていた可能性が高い.
ERROR: SQLSTATE[HY000] [1045] Access denied for user 'iotex'@'localhost' (using password: YES)INSERT INTO monitoring_hosts VALUES("jxxxx","192.168.0.19","2018-01-01T00:00:00") ON DUPLICATE KEY UPDATE ip="192.168.0.19",time="2018-01-01T00:00:00"
また,以下のような ERROR は主キーの制約に抵触した (主キーの同じレコードを入力しようとした) 場合に生じる.
ERROR: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'jxxxx-2024-10-31 00:00:00' for key 'PRIMARY'
それ以外については,エラー内容を確認するためにログファイルを見て欲しい.
$ sudo cat /var/log/apache2/error.log
動作確認
$ mysql -u iotex -p iotex -e "select * from j4oss3" Enter password: +-------+---------------------+------+--------------+ | name | time | temp | ip | +-------+---------------------+------+--------------+ | jxxxx | 2024-10-31 00:00:00 | 10 | 172.27.1.193 | +-------+---------------------+------+--------------+
課題
monitoring.php を完成させた後に,monitoring.php に適切なパラメタを与えてテーブル j4oss3 に値を入れる操作を数回行ないなさい.その後,MySQL モニタでテーブルの値を一覧表示せよ. なお,時刻は最近 1 時間以内の値とすること.
完成させた monitoring.php,および実行した SQL 文とその戻り値のスクリーンショット (画像) を wbt のオンラインテキストにコピペせよ.