第8回 PHP環境上でSQLを使っての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に関する内容を行っていきます。
次回講義までの自主学習
学習サイトをピックアップしたので、以下のリンクから自分に合ったものを使って自主学習しましょう。
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回) – プログラミングならドットインストール
理想はすべてのレッスンをやることです。
今は目で見て手で触れる時間を増やすときなので、時間が許す限りやってみましょう。