データベースとSQL - PHP入門
目次
- PHP入門
- PHPの概要
- PHP環境のインストール(XAMPP)・PHPの設定
- PHPの基本・簡単なプログラム
- 文法1
- 文法2
- 様々な関数を使う
- フォームの基本
- システム作成
- オブジェクト指向
- データベースとSQL
- PHPでMySQLを使う
- ブログを作る
- ECサイト(ショッピングサイト)を作る
このページの内容
- はじめに
- データベースとは
- SQLとは
- データベースの仕組み
- MySQLの設定と起動方法
- phpMyAdminの設定
- データベースの作成
- テーブルの作成
- レコードの追加
- レコードの検索
- レコードの更新
- レコードの削除
はじめに
システムが大きくなると、扱うデータの量も増えてきます。そのようなときにデータベースを使うと、データの管理が楽になります。この章ではデータベースの概念について学び、データベースを操作するために必要なSQLの解説を行います。データベースとは
ウェブシステムでは、会員データや記事データなど、様々なデータを保存しておく必要があります。ウェブシステムでデータを保存する手段としては、主に以下の5つがあります。- 変数
- クッキー
- セッション
- ファイル
- データベース
変数によるデータ保存
データを保存しておけるものといえば、まず「変数」があります。しかし、変数はHTTPの仕組みにより、違うページに移動したり、ブラウザを閉じたりすると内容が消えてしまいます。会員サイトなどでは、ページを移動しても、ブラウザを閉じても、会員のデータを退会するまでは保持しておかなければならないので、変数では対応しきれません。
クッキー・セッションによるデータ保存
クッキーとセッションは、あくまで一時的なデータの保持に使われます。どちらもクッキーを使って実現していることが多いので、ブラウザのクッキーを削除するとデータが消えてしまいます。また、クライアント側にデータを保存するので、違うパソコンやブラウザに変えてもデータが無くなります。ファイルによるデータ保存
ファイルは長期間のデータ保持に使えます。しかしファイルは、基本的にデータの読み込みとデータの書き込みの機能しかありません。データ量が多くなってくると、データをすばやく検索できることが重要になってきますが、ファイルは検索には向いていません。データベースによるデータ保存
データベースも長期間のデータ保持が可能で、さらにデータの「作成」「検索」「更新」「削除」を簡単にできる機能があります。システムが大きくなると、データベースを使うことが必須になってきます。
SQLとは
データベースで、データの作成・検索・更新・削除をするにはそれなりの手続きが必要です。それには専用のデータ操作言語である「SQL」を使います。つまりPHPでデータベースを扱うには、PHP言語とSQL言語の両方を知らなければなりません。PHPの言語仕様でデータベースが扱えればとても楽なのですが、なぜ専用の言語が用意されているのでしょう?
それは、データベースというのは1種類だけではなくたくさんの種類があること、そしてデータベースを扱うプログラム言語も、PHPだけではなくたくさんの種類があることが理由です。
新しいデータベースが開発されても、SQLさえ覚えておけばすぐに操作できます。また、どんなプログラム言語を使っていても、SQLさえ覚えておけばすぐにデータベースとやり取りすることができます。
データベースの仕組み
本書では、データベースの中でも「リレーショナルデータベース(RDB)」を扱います。ここでは、会員制のショッピングサイトを例にして、リレーショナルデータベースの仕組みを説明しましょう。ショッピングサイトでは、まず商品データが必要です。商品データは、商品名・価格・商品説明などの項目を含んだデータです。リレーショナルデータベースでは、これらの項目を横軸に取り、縦軸に各商品を取り、二次元の表(テーブル)にします。商品データは「商品テーブル」という名称になります。
商品名 | 価格 | 商品説明 |
---|---|---|
すうどん | 230 | 具がないです |
きつねうどん | 320 | 狐は入っていません |
てんぷらうどん | 480 | 油っこいです |
… | … | … |
通常のシステムでは、このような関連性のあるテーブルをまとめて「データベース」を作ります。
XAMPPにインストールされている「MySQL」は、このようなデータベースを複数扱えるシステムで、正式には「データベースマネージメントシステム(DBMS)」と言います。
MySQLの設定と起動方法
「MySQL」はオープンソースのデータベースです。XAMPPでデフォルトでインストールされています。文字コードの設定
まず最初に、MySQLで文字コードをUTF-8で適切に使うための設定が必要です。XAMPPをインストールしたフォルダ(デフォルトではc:\xampp)の「mysql\bin\my.ini」ファイルをテキストエディタで開き、[mysqld]セクションの下に以下の1行を追加して保存してください。
character-set-server=utf8
これでMySQLサーバの文字コードがUTF-8になります。ただし、MySQLのバージョンが5.5以前では以下のように記述したほうが良いようです。
default-character-set=utf8
skip-character-set-client-handshake
MySQLの起動と終了
では、MySQLを起動してみましょう。「XAMPP Control Panel」を起動し、「MySql」の欄の「Start」ボタンを押せばMySQLサーバが起動します。「Stop」ボタンを押せばMySQLサーバを終了します。
うまく起動しない場合は、XAMPPをインストールしたフォルダの「mysql\data\mysql_error.log」にエラーの原因が書き込まれるので、それを見て対処してください。
phpMyAdminの設定
MySQLのデータベースを操作するためにXAMPPでは「phpMyAdmin」というウェブアプリケーションが入っています。ApacheとMySQLを起動しておき、ブラウザで「http://localhost/phpmyadmin/」を開くとphpMyAdminが立ち上がります。まずトップページの真ん中あたりのプルダウンから、言語を「日本語」にしておきましょう。
画面下にエラーメッセージが2つ表示されていますが、「リンクテーブルを処理するための追加機能が無効になっています。」というメッセージは、この追加機能を使わないので無視してかまいません。その下のメッセージは、MySQLのIDがrootでパスワードがないので、セキュリティが甘いということです。実際に外部にサイトを公開するときはIDとパスワードを設定する必要がありますが、今回はローカルでの動作確認なので、このままにしておきます。
データベースの作成
データが入るテーブルを作る前に、まずテーブルをまとめるデータベースを作る必要があります。サンプルとして「麺類データベース」を作ってみましょう。データベース名は「men」とします。phpMyAdminの機能でデータベースを作成する
簡単に作成するには、phpMyAdminの「新規データベースを作成する」の欄に「men」と書いて作成ボタンを押します。SQL文でデータベースを作成する
phpMyAdminが使えない環境にあることも考慮して、SQLでデータベースを作成する方法も説明します。トップページの「SQL」タブを押すと、直接SQL文を実行(SQLの場合は「発行」と言います)できます。
テキストエリアに
CREATE DATABASE men;
と入力して「実行する」ボタンを押してください。データベースを作成するためのSQL文は以下のようになります。
データベース作成のSQL構文
CREATE DATABASE データベース名;
正常に作成されると、左カラムのデータベース一覧に表示されます。
データベースの削除
データベースを削除する場合は、
DROP DATABASE men;
と入力してSQLを発行してください。テーブルの作成
麺類データベースができたので、次にその中にテーブルを作ってみましょう。まずはうどんの種類を表すテーブルを作成してみましょう。テーブル名は「udon」とします。データベースの選択
まず左カラムから「men」をクリックして、データベースを選択します。データベースにテーブルを作成したり操作したりする場合は、必ずこうやって対象のデータベースを選択した状態にしなければいけません。
テーブルの作成
データベースを選択したら、SQLタブを押して、以下のSQLを実行します。
CREATE TABLE udon(name TEXT, price INT);
これで「udon」というテーブルが作成されます。項目として「name」(名前)と、「price」(価格)を持ちます。この各項目のことを「カラム」または「フィールド」と言います。テーブルを作成するためのSQL構文を以下に示します。
テーブル作成のSQL構文
CREATE TABLE テーブル名(カラム名 カラム型, カラム名 カラム型, …);
テーブル名の後ろに括弧を付け、中にカラム名とカラム型の組を必要なだけ記述します。カラム型について
カラム型には、項目に入る値の種類を書きます。主に数値型・文字列型・日付と時刻型に分かれています。カラム型 | 中に入る値 |
---|---|
INT | 整数 |
VARCHAR(n) | n文字までの文字列 |
TEXT | 制限のほぼない文字列 |
DATETIME | 日付と時刻 |
DATE | 日付 |
TIME | 時刻 |
テーブルの構造
テーブルを作成すると、phpMyAdminの左カラムに表示され、選択できるようになります。左カラムから「udon」テーブルをクリックして、テーブルの構造を確認してみましょう。
CREATE TABLE文で指定したとおり、nameフィールドはTEXT型、priceフィールドはINT型になっています。
照合順序について
nameフィールドの照合順序が「utf8_general_ci」となっていることを確認してください。この部分が適切でないと文字化けの原因になります。「文字セット」タブを押すと照合順序の一覧が出ます。「照合順序」とは、検索などで文字を照合する順番のルールのことです。何も設定しないと何故か「latin1_swedish_ci」というスウェーデン語のルールになってしまい、文字化けする可能性があります。「utf8_general_ci」ならば日本語の文字列も適切に扱えます。さらに厳密に照合したいのならば「utf8_bin」にすると良いようです。
テーブルの削除
テーブルを削除したい場合は「DROP TABLE」構文を使います。テーブル削除のSQL構文
DROP TABLE テーブル名;
レコードの追加
udonテーブルができましたので、早速データを追加してみましょう。データベースで追加するデータのことを「レコード」と言います。menデータベースに入った状態でSQLタブから以下のSQL文を発行してください。
INSERT INTO udon VALUES('すうどん', 220);
左カラムから「udon」テーブルを選択して「表示」タブを押して、正しくレコードが追加されていることを確認してください。name | price |
---|---|
すうどん | 220 |
レコード追加のSQL構文
INSERT INTO テーブル名 VALUES(値1, 値2, …);
カラムの左から順番に値1、値2、…が入ります。SQLでは文字列をシングルクォートまたはダブルクォートで囲みます。カラム名を指定してレコードを追加することもできます。その場合のSQL構文は以下のようになります。
カラムを指定したレコード追加
INSERT INTO テーブル名(カラム名1, カラム名2, …) VALUES(値1, 値2, …);
練習でいくつかレコードを追加してみましょう。以下のSQLを発行し、表示タブからデータを確認してみてください。
INSERT INTO udon VALUES('きつねうどん', 320);
INSERT INTO udon VALUES('てんぷらうどん', 420);
INSERT INTO udon VALUES('ざるうどん', 280);
INSERT INTO udon VALUES('カレーうどん', 400);
INSERT INTO udon VALUES('うどん定食', 500);
name | price |
---|---|
すうどん | 220 |
きつねうどん | 320 |
てんぷらうどん | 420 |
ざるうどん | 280 |
カレーうどん | 400 |
うどん定食 | 500 |
レコードの検索
次にレコードの検索をしてみましょう。まず以下のSQL文を発行してみてください。
SELECT * FROM udon;
これはudonテーブルから全てのレコードを選択する、という意味です。実行結果は以下のようになります。name | price |
---|---|
すうどん | 220 |
きつねうどん | 320 |
てんぷらうどん | 420 |
ざるうどん | 280 |
カレーうどん | 400 |
うどん定食 | 500 |
レコード検索のSQL構文
SELECT * FROM テーブル名 WHERE 条件式;
WHERE句の後ろにレコードを絞り込む条件を書きます。WHERE句自体を省略すると、上記のように全てのレコードが対象になります。では条件式をセットしたSQL文をいくつか発行してみましょう。
SELECT * FROM udon WHERE price=320;
name | price |
---|---|
きつねうどん | 320 |
SELECT * FROM udon WHERE price<=320;
name | price |
---|---|
すうどん | 220 |
きつねうどん | 320 |
ざるうどん | 280 |
SELECT * FROM udon WHERE price IN(220, 320, 500);
name | price |
---|---|
すうどん | 220 |
きつねうどん | 320 |
うどん定食 | 500 |
SELECT * FROM udon WHERE name LIKE '%うどん';
name | price |
---|---|
すうどん | 220 |
きつねうどん | 320 |
てんぷらうどん | 420 |
ざるうどん | 280 |
カレーうどん | 400 |
SELECT * FROM udon WHERE name LIKE 'うどん%';
name | price |
---|---|
うどん定食 | 500 |
SELECT * FROM udon WHERE name LIKE '%うどん%';
name | price |
---|---|
すうどん | 220 |
きつねうどん | 320 |
てんぷらうどん | 420 |
ざるうどん | 280 |
カレーうどん | 400 |
うどん定食 | 500 |
SELECT * FROM udon WHERE name LIKE '%うどん' AND price>=400;
name | price |
---|---|
てんぷらうどん | 420 |
カレーうどん | 400 |
SELECT * FROM udon WHERE price<300 OR price>400;
name | price |
---|---|
すうどん | 220 |
てんぷらうどん | 420 |
ざるうどん | 280 |
うどん定食 | 500 |
SELECT * FROM udon ORDER BY price;
name | price |
---|---|
すうどん | 220 |
ざるうどん | 280 |
きつねうどん | 320 |
カレーうどん | 400 |
てんぷらうどん | 420 |
うどん定食 | 500 |
SELECT * FROM udon WHERE price>=300 ORDER BY price DESC;
name | price |
---|---|
うどん定食 | 500 |
てんぷらうどん | 420 |
カレーうどん | 400 |
きつねうどん | 320 |
SELECT name FROM udon;
name |
---|
すうどん |
きつねうどん |
てんぷらうどん |
ざるうどん |
カレーうどん |
うどん定食 |
レコードの更新
次にレコードの更新、つまり既にあるレコードの内容の修正をしてみましょう。以下のSQL文を発行してみてください。
UPDATE udon SET name='たぬきうどん' WHERE name='きつねうどん';
実行結果は以下のように「きつねうどん」のレコードが「たぬきうどん」になります。name | price |
---|---|
すうどん | 220 |
たぬきうどん | 320 |
てんぷらうどん | 420 |
ざるうどん | 280 |
カレーうどん | 400 |
うどん定食 | 500 |
レコード更新のSQL構文
UPDATE テーブル名 SET カラム名1=値1, カラム名2=値2… WHERE 条件式;
条件式を指定しないと全レコードが更新されます。以下のSQL文を発行してみてください。
UPDATE udon SET price=price+20;
name | price |
---|---|
すうどん | 240 |
たぬきうどん | 340 |
てんぷらうどん | 440 |
ざるうどん | 300 |
カレーうどん | 420 |
うどん定食 | 520 |
レコードの削除
次にレコードの削除を行ってみましょう。以下のSQL文を発行してみてください。
DELETE FROM udon WHERE price<=300;
価格が300円以下のレコードが削除されます。name | price |
---|---|
たぬきうどん | 340 |
てんぷらうどん | 440 |
カレーうどん | 420 |
うどん定食 | 520 |
レコード削除のSQL構文
DELETE FROM テーブル名 WHERE 条件式;
DELETE文も、条件式を省略するとテーブル内の全てのレコードが削除され、元に戻せないので注意してください。