第8回 PHP環境上でSQLを使ってのDB(データベース)管理

データベース(以下DB)の操作にはプログラミング言語であるSQLが必要になります。
そしてそのSQLは、PHPやPython、Rubyなどのプログラミング環境内で利用することにより、DBとの連携が可能になります。
今回の講義では、PHPを利用してDB管理を行います。

予習のおさらいと解説

予習内容の確認

まず、先日UPした予習記事をおさらいしていきましょう。
以下のリンクから。


SQLでDBの作成、テーブルの追加、データの挿入といった作業を行いました。
一度で覚えるには少々難しいので、解説を行います。

DB作成のSQL

予習で利用したDB作成SQLの解説から行います。

CREATE DATABASE IF NOT EXISTS `db_test_001` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

上の一文を分解してみましょう。

CREATE DATABASE:DBを作成する

CREATE DATABASE `DB名`;

MySQLでDBを作成するには、「CREATE」文を使います。このDBに対する「CREATE」権限がないと実行できません。

DBが存在しなければ作成:IF NOT EXISTS

CREATE DATABASE IF NOT EXISTS `DB名`;

DBが存在しなければ作成するという命令です。
これを指定せずに、同名の重複するDBを作成しようとするとエラーとなります。
エラー回避のためつけるようにしましょう。

標準の文字コードを指定する:CHARACTER SET

CREATE DATABASE `DB名` DEFAULT CHARACTER SET 文字コード;

日本語などのマルチバイト文字をプログラムで扱う場合、文字コードの設定は重要です。
そのため、DB作成時は、必ず「CHARACTER SET」句で文字コードを指定しましょう。

DB照合順序を指定する:COLLATE

CREATE DATABASE `DB名` COLLATE 照合順序;

データベース照合順序とは、名前の通り照合する順番を指します。
すなわち、文字列の比較方法の指定です。
今回使われた「utf8mb4_general_ci」は、文字コードは「utf8mb4」となり、4バイト文字である絵文字を利用できる文字コード。
言語は多言語を示す「general」、文字列の比較方法は大文字と小文字が区別されない 「ci」であるということを意味します。

テーブル作成のSQL

DBにおけるテーブルというのは、エクセルの表一覧の枠組みのようなものと考えてください。
一番上の行に項目名を入れて表を作るのと同じで、DBも最初に項目名を決めてテーブルを作成します。

では、予習で利用したテーブルの作成SQLの解説を行います。

USE `db_test_001`;

CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `user_name` varchar(255) NOT NULL
);
 
ALTER TABLE `user` ADD PRIMARY KEY (`user_id`);
 
ALTER TABLE `user` MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT;

上のSQL文を分解してみましょう。
書き方は様々ありますが、上記SQLはphpMyAdminから直接エクスポートしたものを記載しています。

USE:利用するDBを指定する

USE `DB名`;

複数のDBがある中で、どのDB内にテーブルを作成するのか指定しないことには始まりません。
指定されていない場合には記述が必要です。

CREATE TABLE:テーブルを作成する

CREATE TABLE `テーブル名` (カラム1 型情報, カラム2 型情報, ...);

DB作成と同じく「CREATE」文を使います。

テーブル名の文字数・記号

テーブル名には、クォーテーションなしでテーブル名に使える文字は、英数字、アンダーバー「_」、ドル記号「$」です。
ハイフン「-」などその他の記号は、クォーテーションなしで使えないのでできれば避けましょう。
さらに、テーブル名は64バイト以内となっています。

そして、そのテーブルの中に入る項目を『カラム』または『フィールド』といい、データ型の指定が必要になります。
簡単なものでは以下があります。

  • INT:整数型(IDなどの番号を入れる)
  • VARCHAR:可変長文字型(名前やメールアドレス、単語系の文字列を入れる)
  • TEXT:テキスト型(長文、ブログの文章などを入れる)
  • DATETIME:日付時刻型(作成日時や更新日時を入れる)

そして、上記のデータ型とは別にカラムに対するオプション設定があります。
以下のようによく使われるものがあります。

  • NOT NULL:データをnull(空)で保存することを禁止する
  • AUTO_INCREMENT:自動的に連番データを入れてくれる
  • PRIMARY KEY:カラムの値の重複禁止
  • DEFAULT:標準で指定されたデータが自動で入力される

データ型の一覧は以下の記事が参考になります。
MySQLテーブル設計のための、よく使うデータ型まとめ | サービス | プロエンジニア

ALTER TABLE:テーブルの情報を編集する

ALTER TABLE `テーブル名` ADD PRIMARY KEY (`カラム名`);

PRIMARY KEYを指定し、重複禁止のカラムとします。

ALTER TABLE `テーブル名` MODIFY `カラム名` int(11) NOT NULL AUTO_INCREMENT;

AUTO_INCREMENTを指定し、連番自動挿入のカラムとします。

その他にもテーブルの追加、テーブル名の変更など様々な操作用SQLがあります。
参考に以下をご覧ください。
MySQLでALTER TABLEを使ってテーブル構造を変更する方法【初心者向け】 | TechAcademyマガジン

レコード挿入のSQL

これまでの作業でテーブルが完成し、レコードを挿入していく準備ができました。

INSERT INTO `user` (`user_name`) VALUES ('佐藤'),('伊藤');

挿入SQLは上の通りで、挿入後の完成予想図は以下のようになります。

カラム user_id user_name
レコード 1 佐藤
レコード 2 伊藤

上のテーブルと見てわかるように、「user_id」が自動的に挿入されています。
これは、テーブル作成時に設定したAUTO_INCREMENTによるものです。
データを整理する際にエクセルでも連番を打つように、DBでも同じことが言えます。

INSERT INTO:レコードの挿入

INSERT INTO `テーブル名` (`カラム名`) VALUES (値);

(値)の後にカンマで区切ると、一度に複数のレコードが挿入できます。

UPDATE:レコードの更新(修正)

UPDATE `テーブル名` SET `カラム名` = '新しい値' WHERE `カラム名` = '対象レコードの値';

上の分だけ見てもわかりづらいので、先程の完成図の「user_id」である「伊藤」を「鈴木」に改名してみます。

UPDATE `user` SET `user_name` = '鈴木' WHERE `user_id` = 2;

このように、「user_id」が基準となって修正されました。
ちなみに、このWHERE `user_id` = 2の指定がなければ、全部のレコードの名前が「鈴木」になります。

DELETE:レコードの削除

DELETE FROM `テーブル名` WHERE `カラム名` = '対象レコードの値';

指定したレコードだけ削除するようにしましょう。

TRUNCATE:全レコードのリセット

TRUNCATE TABLE `テーブル名`;

これを行うと、レコードの全削除が行われ、連番のIDもまた1からセットされます。

以上がレコードの挿入、更新、削除となります。
詳細な解説は以下の記事が参考になります。
【MySQL入門】INSERT文を使いこなす!基本からSELECT句まで一挙紹介 | 侍エンジニア塾ブログ(Samurai Blog) – プログラミング入門者向けサイト
MySQLでUPDATEを使ってレコードを更新する方法【初心者向け】 | TechAcademyマガジン

PHPのDB接続・操作

DBの接続

まず、C:\xampp\htdocs内にdb_test_001.phpファイルを作成します。
ファイルを作成したらテキストエディタを開き、以下の内容をコピペします。

<?php
try {
    // データベースに接続
    $pdo = new PDO(
        'mysql:dbname=db_test_001;host=localhost;charset=utf8mb4',
        'USERNAME',//DB作成時に設定したユーザー名
        'PASSWORD',//ユーザーに設定したパスワード
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]
    );

	$stmt = $pdo->query('SELECT * FROM user');
	print_r($stmt->fetchAll());

} catch (PDOException $e) {

    // エラーが発生した場合は「500 Internal Server Error」でテキストとして表示して終了する
    header('Content-Type: text/plain; charset=UTF-8', true, 500);
    exit($e->getMessage()); 
}
?>

DBの接続に関しては、PDO(PHPからデータベースにアクセスする機能を提供する拡張モジュール)を利用しています。
PDOがどういうものかを深く考えるのはいずれとして、便利な機能だと思ってください。

上記コード内にある「’USERNAME’」と「’PASSWORD’」の箇所だけ、自分で登録したものに編集してください。
DBの接続が成功していれば、DBに保存された内容が展開されます。

レコード取得のSQL

展開された内容をみるとわかりますが、これはDB「db_test_001」内にあるテーブル「user」の中身をすべて呼び出すという以下のSQLによるものです。

SELECT * FROM user

SELECT:レコードの取得

SELECT 'カラム名 or *' FROM `テーブル名`;

これはレコード全件を取得する書き方ですが、目的を限定したレコードの取得方法があります。
*(アスタリスク)を用いると、すべてのカラムを取得します。

今後、このSELECT文に関する学習を深めていきます。

まとめ

今回の講義をまとめると、以下のようになります。

  • DBの操作はSQL言語で行う
  • DBの操作はphpMyAdminでもできるが、SQLで行った方が早い
  • テーブルのカラムは、複数のデータ型から目的に応じて一つ選ぶ必要がある。
  • DBの接続はPHPのPDOという拡張モジュールを利用する
  • DBからの情報の呼び出しはSELECT文を使う

今回の講義は新たな知識としてDBを学びました。
現在では利用されていない機械やサービスはないのではないか、というぐらい重要な機能です。
もしWEB業界でDBがなければ、LINEもTwitterもInstagramも存在できません。

このように、避けることのできない知識なので、じっくりと時間をかけて学習していきましょう。
次回の講義でもDBに関する内容を行っていきます。

次回講義までの自主学習

基礎としてHTMLとCSSは必須となりますので、できるかぎり触れましょう。
学習サイトをピックアップしたので、以下のリンクから自分に合ったものを使って自主学習しましょう。

NEW!!

SQL | プログラミングの入門なら基礎から学べるProgate[プロゲート]
MySQL入門 (全36回) – プログラミングならドットインストール

基礎知識

HTML & CSS | プログラミングの入門なら基礎から学べるProgate[プロゲート]
HTML/CSS入門編のレッスン一覧 | プログラミング学習サービス【paizaラーニング】
HTML入門 (全15回) – プログラミングならドットインストール
CSS入門 (全17回) – プログラミングならドットインストール
実践!ウェブサイトを作ろう (全16回) – プログラミングならドットインストール

STEP UP!!

はじめてのJavaScript (全11回) – プログラミングならドットインストール
JavaScript入門編のレッスン一覧 | プログラミング学習サービス【paizaラーニング】
JavaScript | プログラミングの入門なら基礎から学べるProgate[プロゲート]
Bootstrap 4入門 (全22回) – プログラミングならドットインストール

さらにSTEP UP!!

PHP入門編のレッスン一覧 | プログラミング学習サービス【paizaラーニング】
PHP | プログラミングの入門なら基礎から学べるProgate[プロゲート]
PHP入門 (全30回) – プログラミングならドットインストール

理想はすべてのレッスンをやることです。
今は目で見て手で触れる時間を増やすときなので、時間が許す限りやってみましょう。