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 のオンラインテキストにコピペせよ.