【PHP日記】

自分の知識不足を悟った末、なるべく1日一回、Webに関する知識を書いていくだけのブログ。

SQLの『JOIN ON』の挙動を把握する 【26日目】

データベース操作で必須となる『テーブル結合』の挙動を把握したいと思います。


概要

SQLにおいてテーブル同士を結合するのが『JOIN』コマンドです。

基本的な使い方としては、同じ『カラム名』を持つテーブルを2つ以上選択し、JOINコマンドで結合します。

すると、そのカラム名を基準に作成された新しいテーブルが返されます。



各テーブルの仕様

【product_tb】

+------------+---------------+-------+-------+--------------------------+
| product_id | product_name  | price | stock | detail                   |
+------------+---------------+-------+-------+--------------------------+
| 1          | りんご        | 120   | 0     | とてもおいしいりんごです。|
| 2          | みかん        | 100   | 0     | とてもおいしいみかんです。|
| 3          | もも          | 200   | 0     | とてもおいしいももです。  |
| 4          | ぶどう        | 250   | 0     | とてもおいしいぶどうです。|
| 5          | さくらんぼ    | 300   | 0     | とてもおいしいさくらんぼです。|
+------------+---------------+-------+-------+--------------------------+


【order_tb】

+----------+---------------------+-------------+
| order_id | order_date          | customer_id |
+----------+---------------------+-------------+
|        1 | 2016-08-01 00:00:00 |           2 |
|        2 | 2016-07-01 00:00:00 |           2 |
|        3 | 2016-07-01 00:00:00 |           3 |
|        4 | 2016-06-01 00:00:00 |           1 |
|        5 | 2016-05-01 00:00:00 |           2 |
+----------+---------------------+-------------+


【order_detail_tb】

+-----------------+----------+------------+---------------+
| order_detail_id | order_id | product_id | product_count |
+-----------------+----------+------------+---------------+
|               1 |        1 |          5 |             1 |
|               2 |        1 |          4 |             2 |
|               3 |        1 |          2 |            10 |
|               4 |        2 |          1 |             3 |
|               5 |        2 |          2 |             4 |
|               6 |        3 |          1 |             2 |
|               7 |        3 |          3 |             4 |
|               8 |        3 |          4 |             3 |
|               9 |        3 |          5 |             2 |
|              10 |        4 |          2 |             3 |
|              11 |        4 |          1 |             5 |
|              12 |        5 |          5 |             7 |
+-----------------+----------+------------+---------------+


【customer_tb】

+-------------+---------------+--------------+--------------+
| customer_id | customer_name | customer_age | address      |
+-------------+---------------+--------------+--------------+
|           1 | 田中太郎      |           37 | 板橋区       |
|           2 | 伊藤和彦      |           33 | 立川市       |
|           3 | 五味隆      |           31 | 千代田区     |
+-------------+---------------+--------------+--------------+



実際にテーブルを結合していく

SELECT
   ord.order_id,
   cus.customer_name
FROM
   order_tb ord
JOIN
  customer_tb cus
ON
  ord.customer_id = cus.customer_id;

これを実行するとこうなります。

+----------+---------------+
| order_id | customer_name |
+----------+---------------+
|        1 | 伊藤和彦      |
|        2 | 伊藤和彦      |
|        3 | 五味隆       |
|        4 | 田中太郎      |
|        5 | 伊藤和彦      |
+----------+---------------+

これは、『customer_id』というカラムを基準にテーブルを結合した上で、『order_id』と『customer_name』という2つの情報を抜き出して表示した、ということですね。

FROMJOIN で結合するテーブルを選択し、ON で基準となるカラム名を選択しています。この時、エイリアスを作成することで、SELECT文の中で簡潔した書き方ができるようにされています。

ちなみに、通常のJOIN句の場合は、中身の『order_tb』と『customer_tb』順番がどちらでも(入れ替わっても)問題がない場合が多いです。



3つ以上のテーブルを結合する

3つ以上のテーブルを結合した上で、必要な情報を取り出す場合はこうなります。

SELECT
  ord.order_id,
  pro.product_id,
  pro.product_name,
  pro.price,
  order_detail.product_count,
  pro.price * order_detail.product_count AS sales
FROM
  order_tb ord
JOIN
  order_detail_tb order_detail
ON
  ord.order_id = order_detail.order_id
JOIN
  product_tb pro
ON
  order_detail.product_id = pro.product_id;

この結果はこうなります。

+----------+------------+-----------------+-------+---------------+-------+
| order_id | product_id | product_name    | price | product_count | sales |
+----------+------------+-----------------+-------+---------------+-------+
|        1 |          5 | さくらんぼ      |   300 |             1 |   300 |
|        1 |          4 | ぶどう          |   250 |             2 |   500 |
|        1 |          2 | みかん          |   100 |            10 |  1000 |
|        2 |          1 | りんご          |   120 |             3 |   360 |
|        2 |          2 | みかん          |   100 |             4 |   400 |
|        3 |          1 | りんご          |   120 |             2 |   240 |
|        3 |          3 | もも            |   200 |             4 |   800 |
|        3 |          4 | ぶどう          |   250 |             3 |   750 |
|        3 |          5 | さくらんぼ      |   300 |             2 |   600 |
|        4 |          2 | みかん          |   100 |             3 |   300 |
|        4 |          1 | りんご          |   120 |             5 |   600 |
|        5 |          5 | さくらんぼ      |   300 |             7 |  2100 |
+----------+------------+-----------------+-------+---------------+-------+

やっていることは同じで、ON句の後に再び『JOIN』を追加することで結合するテーブルを増やし、最後に取り出したい中身を出力しています。



以上です。


linuxコマンド 【25日目】

CUIで必須となるLinuxコマンドを、備忘録としてまとめて置きます。


コマンド一覧

コマンド 概要
ls 今いるディレクトリのファイル一覧表示
ll ファイル一覧を詳しく表示
pwd 今いるディレクトリがどこか表示
cd ディレクトリ移動
man 指定したコマンドのマニュアルを表示
vi ファイル名 ファイルを作成、既存のファイルを編集する
cat/less/tail ファイル名 ファイルの閲覧
mkdir/rmdir フォルダ名 ディレクトリの作成/削除
cp コピー元のパス 保存先のパス ファイルを複製する
rm ファイル名 ファイル・フォルダの削除
mv 移動したいファイル 保存先のパス ファイル・フォルダの移動(保存先のパスは『./』を使用する)
chmod *** ファイル名 ファイル・フォルダの権限を変更
./ 今いるところ
cd .. 一つ上の階層に行く
touch 指定したファイルを作成
^C Ctrlと Cを同時に押すことによる入力、現在実行中のコマンドを中断
cd - 一つ前にいたところに戻る
clear ごちゃごちゃしたターミナルを一旦クリアにする。



mysqli()関数まとめ 【24日目】

自分が見返す用にまとめている、MySQLを操作する関数である『mysqli()』についての備忘録です。


PHP側からデータベースを新規に作成する

<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$database = "myNewDB";

// MySQLサーバーへの接続
$conn = mysqli_connect($servername, $username, $password);

// データベースが存在するか確認
$sql = "SHOW DATABASES LIKE '$database'";
$result = mysqli_query($conn, $sql);

// データベースが存在しない場合のみ作成
if (mysqli_num_rows($result) == 0) {
    $sql = "CREATE DATABASE $database";
    mysqli_query($conn, $sql);
};

// 接続を閉じる
mysqli_close($conn);
?>



そのデータが含まれているかを確認する

mysqli_num_rows()mysqli_query() によって得られた結果セットの行数を返します。

この関数を使うことで、SELECTの結果として返される行の数や、結果セットに含まれる行が存在するかどうかを確認することができます。

// データベースへの接続
$connection = mysqli_connect("hostname", "username", "password", "database");

// クエリの実行
$result = mysqli_query($connection, "SELECT * FROM users");

// 行数の取得
$row_count = mysqli_num_rows($result);
echo "Number of rows: " . $row_count;

// リソースの解放
mysqli_free_result($result);

// 接続の終了
mysqli_close($connection);

この例では、users テーブルからすべての行を選択し、その行数を取得して表示しています。

注意点としては、mysqli_num_rows()SELECTクエリの結果セットに対してのみ使用できます。INSERT、UPDATE、DELETEクエリなどの結果セットを返さないクエリに対してこの関数を使用すると、期待する結果は得られません。

また結果セットを使用した後は、mysqli_free_result() 関数を使用してリソースを解放することが推奨されます。



以上です。


PHP雑学⑦ 【23日目】

PHPを学び始めた素人目線での、大事だったり大事じゃなかったりする雑知識メモ、その⑦です。


MySQLの『grant』コマンドを詳しくみていく

GRANT文SQLでユーザーに指定した権限を付与するコマンドですが、その中身について詳しくみていきます。

ターミナルでMySQLにログイン後、以下のコマンドを打ち込みます。

grant all privileges on hoge_db.*to hoge_user@'localhost' identified by 'hoge_pass' with grant option;


GRANT ALL PRIVILEGES ON hoge_db.*

hoge_db』データベースに対しての全ての権限(SELECT, INSERT, UPDATE, DELETE等)を付与しています。『*』はデータベース内の全てのテーブルの意味です。


TO hoge_user@'localhost'

hoge_user』というユーザー名に権限を付与(未定義なら新規に作成)します。@'localhost'はこのユーザーがローカルホスト(MySQLサーバーが稼働しているマシン)から接続することを表します。


IDENTIFIED BY 'hoge_pass'

hoge_user』のパスワードをhoge_passに設定します。


WITH GRANT OPTION

このオプションを付けることで『hoge_user』は他のユーザーにも権限を付与することができます。ただし付与できるのはそのユーザーが許可されている権限までです。


MySQL 5.7以降についての補足

MySQL5.7までは、GRANTコマンドで未定義のユーザーを指定すると『ユーザーの作成』から『権限の付与』まで同時に行うことが出来ていましたが、MySQL 5.7以降では、まずCREATE USERを使ってユーザーを作成し、その後にGRANTを使って権限を付与する必要があります。



『$_POST』で同じname属性を参照するには

チェックボックスなどで、同じ name 属性を持つ複数の値が送信される場合、その name 属性に角括弧『[]』を付けることで配列として扱うことができます。

これにより、チェックされたそれぞれの値が配列として受け取れるようになります。

<form action="" method="post">
    <input type="checkbox" name="interests[]" value="スポーツ">スポーツ<br>
    <input type="checkbox" name="interests[]" value="音楽">音楽<br>
    <input type="checkbox" name="interests[]" value="旅行">旅行<br>
    <input type="submit" value="送信">
</form>

このフォームで複数のチェックボックスが選択された場合、PHP側では以下のようにして各値を取得できます。

if (isset($_POST['interests'])) {
    $interests = $_POST['interests'];
    foreach ($interests as $interest) {
        echo $interest . '<br>';
    }
}

また $_POST['interests'] の中の値の順番は、HTML フォーム内で定義されたチェックボックスの順序に従います。

つまり、フォーム上で最初に定義された項目が配列の0番目に格納され、次に定義された項目が1番目に格納される、という具合になります。



以上です。


SQLコマンド 【22日目】

自分がよく使うSQLのコマンドの備忘録です。随時追加していきます。


コマンド一覧

コマンド名 概要 使用例
LIKE 指定したパターンに一致する文字列を検索する SHOW DATABASES LIKE '文字列';
CREATE DATABASE データベースを新規に作成する CREATE DATABASE データベース名 default character SET utf8;
DELETE テーブル内の特定のレコードを削除する DELETE FROM テーブル名 WHERE カラム名 = 値;
DROP データベースやテーブルそのものを削除する DROP DATABASE データベース名;
ALTER TABLE テーブルの構造を変更する ALTER TABLE テーブル名 ADD 新カラム名 データ型 制約;
UPDATE カラムのデータを更新する UPDATE テーブル名 SET カラム名 = 値 WHERE 条件;
DESC テーブルの構造を表示する DESC テーブル名;



句・キーワード一覧

名前 概要 使用例
FIRST カラムをテーブルの最初の位置に追加するために使う ALTER TABLE テーブル名 ADD カラム名 INT FIRST;
DROP COLUMN カラムを削除する ALTER TABLE テーブル名 DROP COLUMN カラム名;
RENAME TO テーブルの名前を変更する ALTER TABLE oldTableName RENAME TO newTableName;
ADD テーブルの末尾にカラムを追加する ALTER TABLE テーブル名 ADD 新カラム名 データ型 制約;



制約一覧

制約名 概要 使用例
UNIQUE カラムの全ての値が重複しないことを保証する
DEFAULT カラムにデフォルトの値を設定する



その他


計算して表示する
SELECT SUM(age) AS sum_age, AVG(age) AS average_age
FROM person;

SUMは引数に指定したカラムの合計を計算する命令。

AVGは引数に指定したカラムの平均を出力する命令。

どちらもASで結果に名前をつけることができます。

+---------+-------------+
| sum_age | average_age |
+---------+-------------+
|     118 |     23.6000 |
+---------+-------------+

結果はこのような感じ。



SHOWにはLIKE、SELECTにはWHERE

SHOW文は、MySQLでデータベース、テーブルなどの構造や中身を表示するためのコマンドです。

SHOW TABLES LIKE 'pattern';    // `pattern`が検索したいパターン

LIKE句は、SHOW文の中で特定のパターンに一致するオブジェクトをフィルタリングするために使われます。


SELECT文は、データベース内のテーブルからデータを選択するためのコマンドです。

SELECT * FROM table_name WHERE condition;    // `condition`がフィルタリングする条件

WHERE句は、SELECT文の中で特定の条件に一致する行をフィルタリングするために使われます。



複数には『s』を

CREATE TABLEなどは特定のテーブルに対してのコマンドなため「複数形のs」が付きませんが、SHOW TABLESSHOE DATABASESなどはテーブルの一覧、データベースの一覧のように複数に対して実行しているため「複数形のs」が付きます。

迷った時は、単体か複数どちらに実行しているかで考えます。



テンプレートエンジンとは(twig) 【21日目】

「twig」を使う機会があったので、ついでにPHPにおけるテンプレートエンジンの情報もまとめました。


概要

テンプレートエンジンとは、処理内容(PHP)と表示内容(HTMLとCSSを分けて管理できるようにするためのツールです。

この分離により、スクリプト処理を書く『プログラマー』はPHPファイルを担当し、『デザイナー』はHTMLとCSS部分を担当するように、作業者によってファイルを分担することができます。


使用方法

基本的には、テンプレートファイルの中にプレースホルダPHPを実行するための特殊なマークアップ)を記述し、実行時にこれらのプレースホルダーを"動的なデータ"に差し替えてから、最終的なHTML文書などを生成します。


例えば、データベースから取得したデータをWebページに表示する場合、『.html.twig』内のデータを表示する位置にプレースホルダーが記述することで、実行時にはデータベースのデータに置き換えられます。



テンプレートエンジンの種類

PHPのテンプレートエンジンはいくつかあります。基本は使用するフレームワークで選ぶことになりますが、ここでは人気のあるテンプレートエンジンと簡単な特徴を紹介します。


twig

twigは、PHPで人気のあるテンプレートエンジンの一つです。Symfonyフレームワークにおいて標準的に使用されていますが、他のPHPプロジェクトでも簡単に利用できます。


Smarty

長年にわたり使用されている成熟したテンプレートエンジンで、既存のプロジェクトやレガシーシステムでよく見られます。

参考文献もたくさんあるため、幅広いPHPプロジェクトで使用できるテンプレートエンジンの一つです。


Blade

『Laravel』のデフォルトテンプレートエンジンです。

PHPコードを直接テンプレート内に埋め込むことができ、<?php ?>構文でもとのPHPを呼び出せるのでかなり柔軟に開発が可能です。



以上です。



参考文献

https://www.fenet.jp/dotnet/column/language/7696/


MAMPは何をしているのか 【20日目】

普段、ローカル環境でサーバーを立ち上げる際に何気なく使っているMAMPですが、実際にはどんな処理が裏で行われているのか調べてみました。


概要

MAMPは、MacintoshApacheMySQLPHPの頭文字を取ったもので、Web開発を行うためのローカル環境を簡単に構築するためのソフトウェアです。Windows版もあり、それはXAMPと呼ばれますが基本的な機能は同じです。

ここではMAMPが何をしてくれているのか、その手順を簡単に説明します。



MAMPが提供するもの

Apache Webサーバー

ウェブサイトをホストする*1ためのサーバーソフトウェアです。ブラウザからのリクエストを受け取り、HTMLやPHPなどのファイルを処理して、ブラウザに結果を返します。


MySQLデータベースサーバー

データを保存、管理するためのシステムです。Webアプリケーションからのクエリ*2に応じてデータを提供します。


PHPPerlPythonなどのスクリプト言語

サーバーサイドで実行されるプログラミング言語です。動的なWebページの生成やデータベースとのやり取りなどを行います。



処理の流れ

MAMPが裏でどのような処理を行っているのか、その処理を手順立てて説明します。


1. サーバーソフトウェアのインストール

MAMPをインストールすると、Apache Webサーバー、MySQLデータベースサーバー、PHPなどのプログラミング言語が一括でインストールされます。


2. 環境ファイルの設定
  • Apacheの設定:MAMPは、Apacheの設定ファイルを自動で調整します。例えば、ウェブサーバーがファイルを探す基本となるディレクトリを、MAMPの「htdocs」ディレクトリに指定します。

  • PHPの設定:PHPのファイルが調整され、ローカル開発に適した設定になります。例えば、開発者がコード内の問題を特定しやすくなるための、エラーや警告が表示されるようになります。

  • MySQLの設定:MySQLサーバーの設定も管理します。これにより、データベースの作成や管理をローカルで簡単に行うことができます。


3. サービスの起動と停止

MAMPアプリケーションを開くと、「Start Servers」ボタンと「Stop Servers」ボタンがあります。これらのボタンを使って、ApacheMySQLのサービスを簡単に起動および停止できます。


4. ポートの管理

MAMPでは、ApacheMySQLが使用するポート番号を簡単に変更できます。これにより、他のアプリケーションとのポート衝突を避けることができます。


5. Webサイトのテスト

ローカル環境でWebサイトを開発する場合、「htdocs」ディレクト内にファイルを配置し、ブラウザからアクセスすることで即座にテストが可能です。


6. phpMyAdminの統合

MAMPにはphpMyAdminが組み込まれており、WebブラウザからMySQLデータベースを管理できます。これにより、データベースの作成、編集、削除などが直感的に行えます。



まとめ

MAMPは、Web開発に必要なコンポーネントのインスール、それらの設定、データの管理しやすくなるまでの処理を自動化してくれています。

そのため環境設定などにかかる時間を大幅に節約し、実際の開発作業により多くの時間を割くことができます。



以上です。


*1:インターネット上でHTMLファイル、CSSファイル、JavaScriptファイル、画像ファイルなどを保存し、公開すること

*2:データベースに対して検索、挿入、更新、削除などを行うために送る要求