ポンクソフト

データベースとSQL - PHP入門

前ページ PHP入門 TOP 次ページ

目次

  1. PHP入門
  2. PHPの概要
  3. PHP環境のインストール(XAMPP)・PHPの設定
  4. PHPの基本・簡単なプログラム
  5. 文法1
  6. 文法2
  7. 様々な関数を使う
  8. フォームの基本
  9. システム作成
  10. オブジェクト指向
  11. データベースとSQL
  12. PHPでMySQLを使う
  13. ブログを作る
  14. ECサイト(ショッピングサイト)を作る

このページの内容

はじめに

システムが大きくなると、扱うデータの量も増えてきます。そのようなときにデータベースを使うと、データの管理が楽になります。この章ではデータベースの概念について学び、データベースを操作するために必要なSQLの解説を行います。

データベースとは

ウェブシステムでは、会員データや記事データなど、様々なデータを保存しておく必要があります。ウェブシステムでデータを保存する手段としては、主に以下の5つがあります。

変数によるデータ保存

データを保存しておけるものといえば、まず「変数」があります。しかし、変数はHTTPの仕組みにより、違うページに移動したり、ブラウザを閉じたりすると内容が消えてしまいます。

会員サイトなどでは、ページを移動しても、ブラウザを閉じても、会員のデータを退会するまでは保持しておかなければならないので、変数では対応しきれません。

クッキー・セッションによるデータ保存

クッキーとセッションは、あくまで一時的なデータの保持に使われます。どちらもクッキーを使って実現していることが多いので、ブラウザのクッキーを削除するとデータが消えてしまいます。また、クライアント側にデータを保存するので、違うパソコンやブラウザに変えてもデータが無くなります。

ファイルによるデータ保存

ファイルは長期間のデータ保持に使えます。しかしファイルは、基本的にデータの読み込みとデータの書き込みの機能しかありません。データ量が多くなってくると、データをすばやく検索できることが重要になってきますが、ファイルは検索には向いていません。

データベースによるデータ保存

データベースも長期間のデータ保持が可能で、さらにデータの「作成」「検索」「更新」「削除」を簡単にできる機能があります。

システムが大きくなると、データベースを使うことが必須になってきます。

SQLとは

データベースで、データの作成・検索・更新・削除をするにはそれなりの手続きが必要です。それには専用のデータ操作言語である「SQL」を使います。つまりPHPでデータベースを扱うには、PHP言語とSQL言語の両方を知らなければなりません。

PHPの言語仕様でデータベースが扱えればとても楽なのですが、なぜ専用の言語が用意されているのでしょう?

それは、データベースというのは1種類だけではなくたくさんの種類があること、そしてデータベースを扱うプログラム言語も、PHPだけではなくたくさんの種類があることが理由です。

新しいデータベースが開発されても、SQLさえ覚えておけばすぐに操作できます。また、どんなプログラム言語を使っていても、SQLさえ覚えておけばすぐにデータベースとやり取りすることができます。

データベースの仕組み

本書では、データベースの中でも「リレーショナルデータベース(RDB)」を扱います。ここでは、会員制のショッピングサイトを例にして、リレーショナルデータベースの仕組みを説明しましょう。

ショッピングサイトでは、まず商品データが必要です。商品データは、商品名・価格・商品説明などの項目を含んだデータです。リレーショナルデータベースでは、これらの項目を横軸に取り、縦軸に各商品を取り、二次元の表(テーブル)にします。商品データは「商品テーブル」という名称になります。
商品テーブル
商品名価格商品説明
すうどん230具がないです
きつねうどん320狐は入っていません
てんぷらうどん480油っこいです
さらに、「名前・住所・電話番号」などを項目に持つ「会員テーブル」や、購入情報を記録する「注文テーブル」なども必要です。サイトで買い物をすると、商品テーブルから該当の商品情報を、会員テーブルから購入した会員の情報を取得して、注文テーブルに記録します。このように複数のテーブルが「関係して(リレーショナル)」システムが動くので「リレーショナルデータベース」と言うのです。

images/database.png
通常のシステムでは、このような関連性のあるテーブルをまとめて「データベース」を作ります。

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サーバが起動します。
images/mysql_start.png
「Stop」ボタンを押せばMySQLサーバを終了します。
images/mysql_stop.png
うまく起動しない場合は、XAMPPをインストールしたフォルダの「mysql\data\mysql_error.log」にエラーの原因が書き込まれるので、それを見て対処してください。

phpMyAdminの設定

MySQLのデータベースを操作するためにXAMPPでは「phpMyAdmin」というウェブアプリケーションが入っています。ApacheとMySQLを起動しておき、ブラウザで「http://localhost/phpmyadmin/」を開くとphpMyAdminが立ち上がります。

まずトップページの真ん中あたりのプルダウンから、言語を「日本語」にしておきましょう。
images/phpmyadmin.png
画面下にエラーメッセージが2つ表示されていますが、「リンクテーブルを処理するための追加機能が無効になっています。」というメッセージは、この追加機能を使わないので無視してかまいません。その下のメッセージは、MySQLのIDがrootでパスワードがないので、セキュリティが甘いということです。実際に外部にサイトを公開するときはIDとパスワードを設定する必要がありますが、今回はローカルでの動作確認なので、このままにしておきます。

データベースの作成

データが入るテーブルを作る前に、まずテーブルをまとめるデータベースを作る必要があります。サンプルとして「麺類データベース」を作ってみましょう。データベース名は「men」とします。

phpMyAdminの機能でデータベースを作成する

簡単に作成するには、phpMyAdminの「新規データベースを作成する」の欄に「men」と書いて作成ボタンを押します。
images/make_database.png

SQL文でデータベースを作成する

phpMyAdminが使えない環境にあることも考慮して、SQLでデータベースを作成する方法も説明します。

トップページの「SQL」タブを押すと、直接SQL文を実行(SQLの場合は「発行」と言います)できます。
images/sqltab.png

テキストエリアに
CREATE DATABASE men;
と入力して「実行する」ボタンを押してください。

データベースを作成するためのSQL文は以下のようになります。
データベース作成のSQL構文
CREATE DATABASE データベース名;

正常に作成されると、左カラムのデータベース一覧に表示されます。

データベースの削除

データベースを削除する場合は、
DROP DATABASE men;
と入力してSQLを発行してください。

テーブルの作成

麺類データベースができたので、次にその中にテーブルを作ってみましょう。まずはうどんの種類を表すテーブルを作成してみましょう。テーブル名は「udon」とします。

データベースの選択

まず左カラムから「men」をクリックして、データベースを選択します。
images/select_db.png
データベースにテーブルを作成したり操作したりする場合は、必ずこうやって対象のデータベースを選択した状態にしなければいけません。

テーブルの作成

データベースを選択したら、SQLタブを押して、以下のSQLを実行します。
CREATE TABLE udon(name TEXT, price INT);
これで「udon」というテーブルが作成されます。項目として「name」(名前)と、「price」(価格)を持ちます。この各項目のことを「カラム」または「フィールド」と言います。

テーブルを作成するためのSQL構文を以下に示します。
テーブル作成のSQL構文
CREATE TABLE テーブル名(カラム名 カラム型, カラム名 カラム型, …);
テーブル名の後ろに括弧を付け、中にカラム名とカラム型の組を必要なだけ記述します。

カラム型について

カラム型には、項目に入る値の種類を書きます。主に数値型・文字列型・日付と時刻型に分かれています。
主要なカラム型
カラム型中に入る値
INT整数
VARCHAR(n)n文字までの文字列
TEXT制限のほぼない文字列
DATETIME日付と時刻
DATE日付
TIME時刻
udonテーブルでは、nameカラムを文字列型である「TEXT」にし、priceカラムを数値型である「INT」にしています。

テーブルの構造

テーブルを作成すると、phpMyAdminの左カラムに表示され、選択できるようになります。
images/select_table.png
左カラムから「udon」テーブルをクリックして、テーブルの構造を確認してみましょう。

CREATE TABLE文で指定したとおり、nameフィールドはTEXT型、priceフィールドはINT型になっています。
images/table_info.png

照合順序について

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」テーブルを選択して「表示」タブを押して、正しくレコードが追加されていることを確認してください。
実行結果
nameprice
すうどん220
レコードを追加するSQL構文を以下に示します。
レコード追加の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);
実行結果
nameprice
すうどん220
きつねうどん320
てんぷらうどん420
ざるうどん280
カレーうどん400
うどん定食500

レコードの検索

次にレコードの検索をしてみましょう。まず以下のSQL文を発行してみてください。
SELECT * FROM udon;
これはudonテーブルから全てのレコードを選択する、という意味です。実行結果は以下のようになります。
実行結果
nameprice
すうどん220
きつねうどん320
てんぷらうどん420
ざるうどん280
カレーうどん400
うどん定食500
レコードを検索するSQL構文を以下に示します。
レコード検索のSQL構文
SELECT * FROM テーブル名 WHERE 条件式;
WHERE句の後ろにレコードを絞り込む条件を書きます。WHERE句自体を省略すると、上記のように全てのレコードが対象になります。

では条件式をセットしたSQL文をいくつか発行してみましょう。
SELECT * FROM udon WHERE price=320;
実行結果
nameprice
きつねうどん320
これは価格が320円のレコードを抽出する文です。

SELECT * FROM udon WHERE price<=320;
実行結果
nameprice
すうどん220
きつねうどん320
ざるうどん280
これは価格が320円以下のレコードを抽出する文です。「!=」「<」「>」「<=」「>=」など、比較演算子はPHPと同等ですが、PHPの「==」に対応する演算子は「=」なので注意してください。

SELECT * FROM udon WHERE price IN(220, 320, 500);
実行結果
nameprice
すうどん220
きつねうどん320
うどん定食500
これは価格が220円、320円、500円のレコードを抽出する文です。「IN」句は括弧で指定した値に等しいレコード検索します。逆のはたらきの「NOT IN」句もあります。

SELECT * FROM udon WHERE name LIKE '%うどん';
実行結果
nameprice
すうどん220
きつねうどん320
てんぷらうどん420
ざるうどん280
カレーうどん400
これはnameカラムが「うどん」で終わるレコードを抽出します。LIKE句はあいまい検索ができます。「%」の部分は0文字以上のあらゆる文字列とマッチします。

SELECT * FROM udon WHERE name LIKE 'うどん%';
実行結果
nameprice
うどん定食500
これはnameカラムが「うどん」から始まるレコードを抽出します。

SELECT * FROM udon WHERE name LIKE '%うどん%';
実行結果
nameprice
すうどん220
きつねうどん320
てんぷらうどん420
ざるうどん280
カレーうどん400
うどん定食500
これはnameカラムに「うどん」の含まれるレコードを抽出します。

SELECT * FROM udon WHERE name LIKE '%うどん' AND price>=400;
実行結果
nameprice
てんぷらうどん420
カレーうどん400
これはnameカラムが「うどん」で終わり、なおかつ価格が400円以上のレコードを抽出します。このように条件式は「AND」で繋いで複数書くことができます。

SELECT * FROM udon WHERE price<300 OR price>400;
実行結果
nameprice
すうどん220
てんぷらうどん420
ざるうどん280
うどん定食500
これは価格が300円未満か、または400円より大きいレコードを抽出します。条件式を「OR」で繋ぐと、どちらかの条件を満たすときにマッチします。

SELECT * FROM udon ORDER BY price;
実行結果
nameprice
すうどん220
ざるうどん280
きつねうどん320
カレーうどん400
てんぷらうどん420
うどん定食500
これは全てのレコードを抽出して価格の低い順に並べます。「ORDER BY」句は並べ替えができます。

SELECT * FROM udon WHERE price>=300 ORDER BY price DESC;
実行結果
nameprice
うどん定食500
てんぷらうどん420
カレーうどん400
きつねうどん320
これは価格が300円以上のレコードを大きい順に並べます。「DESC」が大きい順(降順)に並べ替える指定です。WHERE句とORDER BY句を組み合わせるときはWHERE句を先に書きます。

SELECT name FROM udon;
実行結果
name
すうどん
きつねうどん
てんぷらうどん
ざるうどん
カレーうどん
うどん定食
これは全てのレコードを抽出して、nameカラムのみを表示します。「SELECT」の後ろに表示するカラムを指定します。複数指定するときはカンマで繋ぎます。「*」を指定すると全てのカラムを抽出します。

レコードの更新

次にレコードの更新、つまり既にあるレコードの内容の修正をしてみましょう。以下のSQL文を発行してみてください。
UPDATE udon SET name='たぬきうどん' WHERE name='きつねうどん';
実行結果は以下のように「きつねうどん」のレコードが「たぬきうどん」になります。
実行結果
nameprice
すうどん220
たぬきうどん320
てんぷらうどん420
ざるうどん280
カレーうどん400
うどん定食500
レコードを更新するSQL文は以下のようになります。
レコード更新のSQL構文
UPDATE テーブル名 SET カラム名1=値1, カラム名2=値2… WHERE 条件式;
条件式を指定しないと全レコードが更新されます。以下のSQL文を発行してみてください。
UPDATE udon SET price=price+20;
実行結果
nameprice
すうどん240
たぬきうどん340
てんぷらうどん440
ざるうどん300
カレーうどん420
うどん定食520
全レコードの価格が20円増えます。SQL文は一度発行すると基本的に元のレコードに戻すことはできないので注意してください。

レコードの削除

次にレコードの削除を行ってみましょう。以下のSQL文を発行してみてください。
DELETE FROM udon WHERE price<=300;
価格が300円以下のレコードが削除されます。
実行結果
nameprice
たぬきうどん340
てんぷらうどん440
カレーうどん420
うどん定食520
レコードを削除するSQL文は以下のようになります。
レコード削除のSQL構文
DELETE FROM テーブル名 WHERE 条件式;
DELETE文も、条件式を省略するとテーブル内の全てのレコードが削除され、元に戻せないので注意してください。
前ページ PHP入門 TOP 次ページ
このエントリーをはてなブックマークに追加 そっか0