2025 年度 OSS リテラシ3 : WWW サーバとデータベースサーバの連動

はじめに

WWW サーバの受け取った情報を,PHP 言語で書かれたプログラムを介して, データベースに登録できるようにする.

以下の設定方法は Debian wiki に従っている. <URL:https://wiki.debian.org/PHP>.

準備

パッケージインストール

php から mysql を利用するためのライブラリをインストールする.

$ sudo apt update

$ sudo apt install php-mysql 

  ...(略)...

WWW サーバを再起動する

$ sudo systemctl restart apache2

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   

PHP スクリプト (monitoring.php) を ~/public_html/ 以下に作成する. 以下は何点か穴埋めになっているので, 前期の資料(1) を見ながら完成させて欲しい.

<?php
// 設定ファイル
require_once("****/db_info.php"); //ファイルパスの指定

//取得したデータ
$name = htmlspecialchars(***);  //引数処理.HTTP GET メソッド利用.
$time = htmlspecialchars(***);
$temp = htmlspecialchars(***);
$ip   = getenv("REMOTE_ADDR");

//データベースへ接続
try{
   $pdo = new PDO("mysql:host=$SERV;dbname=$DBNM", $USER, $PASS);
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

   $stmt = $pdo->prepare("  *** (:name, :time, :temp, :ip)");  //プレースホルダ利用
   $stmt->bindParam(':name', $name);
   $stmt->bindParam(':time', ****);
   $stmt->bindParam(':temp', ****);
   $stmt->bindParam(':ip',   ****);
   $stmt->execute();

   echo "DATA > ($name, $time, $temp, $ip) \n";

}catch(PDOException $e){
   print "ERROR: ";
   print $e->getMessage();
}
?>

PHP 経由でのデータベースへのデータ入力.

上記の php スクリプトは http の GET メソッドを使って送られてきたデータをデータベースに格納するものとなっている. 例えば以下のように, monitoring.php の ? 以降に "変数名=値" を並べて ブラウザの URL 欄にコピペすれば, それを確かめることができる. 以下は jxxxx という名前のデバイスから,時刻 2024/10/31 00:00:00 に温度 10.0 が送られてきたことに相当する.

なお,IP と ユーザ名 (hogehoge) は自分のものに変更すること!

http://10.10.XX.XX/~hogehoge/monitoring.php?name=jxxxx&time=2024-10-31T00:00:00&temp=10.0

うまくいくと以下のような表示が現れるはずである.これは実行されたデータベース操作言語の命令である.

INSERT INTO j4oss3 VALUES (jxxxx, 2024-10-31T00:00:00, 10.0, 172.27.1.193)

なお,ブラウザ上に以下のように 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 のオンラインテキストにコピペせよ.