この記事は「 つながる勉強会 Advent Calendar 2022 - Adventar 」の 14 日目の記事です。
前日は、リリー🕊Webエンジニア🐶(@lily_otk) さんでした!
数日前につながる勉強会でリリーさんに会いましたがめっちゃ良い人でした。めっちゃ。
こんにちは!
スマレジ・テックファーム の Webエンジニア やまて と申します。
はじめに
「独学エンジニアの課題として、ログ解析システムを作った。」というタイトルで、課題の製作物完成までの道のりを投稿しています。
GitHub の Public リポジトリで誰でも閲覧できるようにしています。
独学エンジニア とは
『独学エンジニア』とは、Web開発(主にサーバーサイド)の動画学習教材です。
連載の目次
「独学エンジニアの課題として、ログ解析システムを作った。」の連載については、以下の順に投稿しています。
- Step1. 製作物の確認
- Step2. DBのテーブル作成
- Step3. データのインポート
- Step4. SELECT 文での検索
- Step5. プログラムからのSQLの操作①
- Step6. プログラムからのSQLの操作②
今回は Step2.DBのテーブル作成 です。
目次
環境
バージョン | |
---|---|
macOS Big Sur | 11.6 |
Docker Desktop | 4.7.0 |
PHP | 8.1.7 |
MySQL | 8.0.28 |
1. テーブル定義の設定
以下のとおり、テーブル定義を設定します。
- テーブル名:page_views
カラム名 | 項目名 | データ型 | 例1 | 例2 |
---|---|---|---|---|
domain_code | ドメインコード | string | aa | aa |
page_title | ページタイトル | string | Main_Page | Wikipedia |
count_views | 各時間のページ表示回数 | int | 4 | 1 |
total_response_size | 合計レスポンスサイズ | int | 0 | 0 |
2. PHP から DB を操作するファイルの作成
PDO モジュールを使用して、 PHP から DB を操作( page_views テーブルを作成)するファイルを作成します。
- 作成・編集:src/databases/initialize_page_views_table.php
<?php function dbConnect(): PDO { $dbHost = 'db'; $dbUsername = 'test_user'; $dbPassword = 'pass'; $dbDatabase = 'test_database'; $dataSourceName = "mysql:host=$dbHost;dbname=$dbDatabase;charset=utf8mb4"; try { $dbh = new PDO($dataSourceName, $dbUsername, $dbPassword, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo 'DB接続エラー' . $e->getMessage(); exit(); }; return $dbh; } function dropPageViewsTable(PDO $dbh) { $sql = 'DROP TABLE IF EXISTS page_views;'; $sth = $dbh->query($sql); if ($sth) { echo 'テーブル削除完了: page_views' . PHP_EOL; } else { exit('テーブル削除エラー: page_views' . PHP_EOL); } $sth = null; } function createPageViewsTable(PDO $dbh) { $sql = <<<EOI CREATE TABLE page_views ( domain_code VARCHAR(100), page_title VARCHAR(100), count_views INTEGER, total_response_size INTEGER ); EOI; $sth = $dbh->query($sql); if ($sth) { echo 'テーブル作成完了: page_views' . PHP_EOL; } else { exit('テーブル作成エラー: page_views' . PHP_EOL); } $sth = null; } $dbh = dbConnect(); dropPageViewsTable($dbh); createPageViewsTable($dbh); $dbh = null;
PDO モジュール
- 参考:公式ドキュメント
PHP Data Objects
(PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。
機密データの扱い
以下のパスワードなどは機密データであるため、ソースコードとは別で管理するために phpdotenv などで環境変数に置き換えるべきかと思います。
$dbHost = 'db'; $dbUsername = 'test_user'; $dbPassword = 'pass'; $dbDatabase = 'test_database'; $dataSourceName = "mysql:host=$dbHost;dbname=$dbDatabase;charset=utf8mb4";
今回は、課題であるデータベース、SQLスキルの向上に専念するため、環境変数として分離していません。
3. PHP から DB の操作の実行
PHP から DB の操作を実行します。
3-1. Docker コンテナの起動
Docker コンテナを起動します。
docker-compose up -d
# r_yamate @ mbp in ~/Documents/code/wikipedia-log-analysis-tool on git:feature/create-tables x [15:15:45] C:1 $ docker-compose up -d Creating wikipedia-log-analysis-tool_db_1 ... done Creating wikipedia-log-analysis-tool_app_1 ... done
Docker コンテナ起動の状況を確認します。
docker-compose ps
# r_yamate @ mbp in ~/Documents/code/wikipedia-log-analysis-tool on git:feature/create-tables x [15:16:13] $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------------ wikipedia-log-analysis-tool_app_1 docker-php-entrypoint apac ... Up 0.0.0.0:50080->80/tcp wikipedia-log-analysis-tool_db_1 /entrypoint.sh mysqld Up (health: starting) 0.0.0.0:53306->3306/tcp, 33060/tcp, 33061/tcp
3-2. page_views テーブルを作成するファイルの実行
「2. PHP から DB を操作するファイルの作成」で作成した、 page_views テーブルを作成する initialize_page_views_table.php ファイルを実行します。
docker-compose exec app php databases/initialize_page_views_table.php
# r_yamate @ mbp in ~/Documents/code/wikipedia-log-analysis-tool on git:feature/create-tables x [15:17:24] $ docker-compose exec app php databases/initialize_page_views_table.php テーブル削除完了: page_views テーブル作成完了: page_views
3-3. page_views テーブルの確認
page_views テーブルが作成されているか確認するため、MySQL に接続して SHOW COLUMNS
で確認します。
docker-compose exec app mysql -h db -u test_user -D test_database -p
# r_yamate @ mbp in ~/Documents/code/wikipedia-log-analysis-tool on git:feature/create-tables x [15:26:30] $ docker-compose exec app mysql -h db -u test_user -D test_database -p Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 31 Server version: 8.0.28 MySQL Community Server - GPL Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [test_database]>
SHOW COLUMNS FROM page_views;
MySQL [test_database]> SHOW COLUMNS FROM page_views; +---------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------------+--------------+------+-----+---------+-------+ | domain_code | varchar(100) | YES | | NULL | | | page_title | varchar(100) | YES | | NULL | | | count_views | int | YES | | NULL | | | total_response_size | int | YES | | NULL | | +---------------------+--------------+------+-----+---------+-------+ 4 rows in set (0.003 sec)
テーブル定義のとおり、作成できていることが確認できました。
おわりに
今回は「独学エンジニアの課題として、ログ解析システムを作った。」の Step2.DBのテーブル作成 でした。
次回は、Step3. データのインポート について投稿します。
ありがとうございました。
弊社サイトのブログ手当のところに掲載してもろた☺️https://t.co/cMrEc2rMUi
— やまて|Webエンジニア2年目 (@r_yamate) 2022年11月17日
学んだ技術をブログ記事として定期的にアウトプットすることで、成長する機会、振り返る機会になると考えてブログ運営をしています。ブログ手当としてサポートしてもらえることで意欲も高まるため、とてもありがたいです!
というコメントを顔写真入りで掲載いただきました!ブログ記事の投稿、しっかりやっていきます。