今度はMariaDBとPHPの連携に挑戦
どうも、じぇいかわさきです。
Pythonは一休みして、今度はIoTをやろうとした時に必要になるデータベースとWeb連携について少々考えてみた。
Pythonはどちらかと言うと、各種センサーをラズパイに接続して、そこからのデータを取得し、その結果をデータベースに蓄積していく作業をさせようとしている。
センサーが手元にないので、入手後にそちらはやるとして、蓄積したデータをWebから呼び出す方法に挑戦してみた。
簡単なようで、かなり手こずり、結局半日以上は使ってしまった。個人的には充実した時間が過ごせたと思っている。
それでは、今回も備忘録的にやったことをまとめていこう。
現状の環境
現状の環境は手元に有るものを活用して構築している。今までのように、mac内に疑似環境を作ってやっても良かったのだが、外に持ち出すことを考慮して余っていたラズパイ3B+を使った。
従って、今回からすべてラズパイ3B+で開発もやっている。開発って言うとかっこいいが、たんなるソースをしこしこと書いているだけだ。
実際に必要なのは、MariaDBとPHP及び、PHPからMariaDBを操作するPDOです。
後は、データベスを作成したりするのに便利なようにphpmyadminをインスト−ルしておく。
今回は、MariaDBは既にインストールしてあったが、それ以外がインストールしていなかったので、何時も通りにsudo apt-get install で各々をインストールした。
このインストールさえ完了すれば、開発準備は整った事になります。
インストールしたもの
①PHP
②PDO Driver
③phpmyadmin
そもそもどこから始めれば良いんだ?
さて、なにかやろうとしてもド素人なので、全てがゼロからのスタートになる。
ず〜と昔、記憶の片隅にSQLServerとDelphiで同じようなことをしたことが有るが、20年以上前の話なので、ほとんど記憶にないに等しい。
という事で、まずはPHPを調べて、どうすればデータベースに接続できるのかを考えた。
記憶の片隅では、直接PHPの記述でできたような気がしたのだが、現状はPDOを用いてデータベースに接続するのが主流のようです。
PDOとはPHP Data Objectsの略称で、PHPからのデータベースアクセスを抽象的にしてくれるらしいのですが、この抽象的というのがいまいち理解できませんでした。
ただ、PDOを使用してデータベースに接続するようにしておくと、MariaDBから他のデータベースに変更しても、そのまま接続ができるようなのです。
多分、このデータベースを選ばないというところが抽象的という部分なんでしょうね。
とは言え、このPDOに部分はドットインストールで丁度勉強している部分なので、もう一度復習をしながら進めれば、なんとか理解できるかもしれない。
ネットで調べながらも、カット&トライを繰り返しました。
用語が難しくて頭が???
PHPのクラスが・・・インスタンスが・・・さっぱりこの意味が分からない。
意味がわからなくてはコードを書けないので、とりあえず調べてみた。
クラスとは クラスとは簡単に説明すると、プログラムの処理をまとめたオブジェクトのことで、あらゆるプログラミング言語でクラスは使用される。
クラスの中では主に、プロパティ(変数や定数)やメソッド(関数)の定義を記述します。
インスタンスは、クラスで定義したプロパティを受け継いでいるもの(すなわちIDとPWという変数が宣言された状態)を指します。
ん〜、何だか分かったような分からないような、スッキリってなふうには行きませんね。このへんが、従来プログラミングを断念させる根源だったのかもしれません。
今回は、紳士的にぶち当たって行くようにします。
とりあえずMariaDBに接続するぞ
まずはPDOインスタンスを生成して、MariaDBに接続する事を考えます。
<?php
try {
$dsn = 'mysql:dbname=test;host=localhost';
$user = 'pi';
$password = '***********';
$dbh = new PDO($dsn, $user, $password);
echo "接続成功\n";
}
これで、PDOが$dbhというインスタンスを生成します。問題なければ、接続成功良いう文字が返ってくるはずです。
これを、Webではなくターミナルで実行して確認します。
>php test.php
できてしまえば、非常に簡単なコードでしかないですが、ここまでたどり着くには非常に時間がかかった。
次はこいつをHTMLに埋め込んで見る
それでは、HTMLのファイルに埋め込み、ファイルを指定したらWebページでみれるかを確認んします。
HTMLのコードはこれです。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>MariaDBへの接続テスト</title>
</head>
<body>
<h1>ロト6当選番号データベース</h1>
<p></p>
<h2>PHPによるMariaDB接続とSELECTテスト</h2>
<?php
$dsn = 'mysql:dbname=test;host=localhost';
$user = 'pi';
$password = '**********';
try{
$dbh = new PDO($dsn, $user, $password);
$sql = 'select * from result';
foreach ($dbh->query($sql) as $row) {
print($row['kaisai'].', ');
print($row['date'].', ');
print($row['No1'].', ');
print($row['No2'].', ');
print($row['No3'].', ');
print($row['No4'].', ');
print($row['No5'].', ');
print($row['No6'].', ');
print($row['bonus']);
print('<br />');
}
}catch (PDOException $e){
print('Error:'.$e->getMessage());
die();
}
$dbh = null;
?>
</body>
</html>
とりあえず、何時も使用しているロト6のデータが、たくさん入っているので活用しやすいから、これをベースにテーブルデータをすべて取り出す記述を、まずは考えました。
192.168.10.15/test.php
テストページにアクセスしてみると、こんな感じで表示されたので、MariaDBとの接続はうまくいき、テーブル内容も無事表示できました。
今は、データを呼び出してカンマ区切りで表示してあるだけですので、次は見た目を綺麗にするようにテーブル表示にできるように挑戦してみたいと思います。
少しずつですが、できていくと楽しいですね。次はこうしたい、次は表示のここを直したいなど、夢は広がります。