コンテンツ

  1. ホーム
  2. 提供サービス
  3. ホスティングサービス
  4. マニュアル・ガイドブック類
  5. コンテンツ作成ガイド
  6. PHP・データベース連携

PHP・データベース連携

コンテンツ作成ガイドTOPに戻る

1.データベースとSQL言語

本節ではデータベースの仕組みについて説明し,リレーショナルデータベースの例としてMySQLを取り上げ解説します.なお,実務的なデータベースサーバの運用などについては,本コンテンツの範囲を超えているため記載しておりません.後述する参考図書などをご覧ください.

データベースとは

データベースとは業務を行うアプリケーションから独立し,データだけを専門に扱うシステムです.データベースは他のアプリケーションなどからの要求を受けてデータの蓄積と検索を行います.

データベースを用いる事で,今までアプリケーションごとにバラバラに作成され扱われていたデータを一元管理して共有する事が可能となり,システムの利便性が向上し,扱う情報の整合性を保つ事も容易になります.ですから,後述するPHPプログラミングによるWebアプリケーションを含め,あらゆる場面でデータベースは利用されています.

データベースの利用

主なデータベースサービスには次のようなものがあります.

  • MySQL
  • PostgreSQL
  • ORACLE
  • MS Access

データベース管理システム(DBMS)の役割

データベースとはいっても,それだけではただの蓄積されたデータの集合にすぎません.実際にデータベースシステムとして利用するためには,アプリケーションなどのクライアントからの要求を理解してデータを処理し結果を返す仲介役のシステムが必要になります.

そこで,データベースの操作や管理を行うためにデータベース管理システム(DBMS)というものが存在します.データベースはDBMSと,2つ一緒にシステムに組込まれて,初めてデータベースサーバとしての役割を果たすのです.DBMSは主に3つの機能を持っています.

データの操作機能
アプリケーションからのデータの作成や取得といった要求に対し,データベースのデータを操作し結果を返す機能です.DBMSはデータベース言語を通じてアプリケーションとやりとりをします.
データの管理機能
データのロック・アンロックやバックアップの実施など,データベースの維持に必要なメンテナンス管理を行う機能です.
ユーザ権限の管理機能
データベースを複数のユーザ(アプリケーション)で利用するために必要な,データへの閲覧・更新といったアクセス権の管理を行う機能です.

DBMSの役割

リレーショナルデータベース

データベースはデータの構造によって以下の4つの種類に分ける事ができます.

  • 階層型データベース
  • ネットワーク型データベース
  • リレーショナルデータベース
  • オブジェクト指向型データベース

今日の情報社会の中で利用されているデータベースの大半はリレーショナルデータベースです.このリレーショナルデータベースはテーブルという概念でデータを扱います.テーブルとは私たちが日常生活の中でよく目にする縦横に線の入った2次元の表の事です.リレーショナルデータベースのデータ構造は以下のようになっています.

リレーショナルデータベースの構造

テーブルの縦軸をフィールド,横軸をレコードと呼びます.ここでフィールドが記録されるデータの項目,レコードが1つ1つのデータ本体に当たります.テーブルにはプライマリキー(主キー)と呼ばれるレコード間でパラメータが絶対に重複しないフィールドを指定しておきます.プライマリキーが指定される事によって,登録されているレコードの特定は保証されます.ですから,通常はIDなどをプライマリキーとして指定しておきます.

このようにデータベースにはフィールドの項目やプライマリキー,ユーザごとのアクセス権限など,定義しなければならない要素がたくさんあります.ですからデータベースを構築するには最初に利用目的を明確にし,どのようなデータベースにするのか構想をしっかり練る必要があります.

特に不必要な要素をデータベースの中に組込めば容量を浪費したり,セキュリティ及びデータの整合性の崩壊につながります.良いデータベースの構築には目的をしっかり見据えて論理的に設計し,不必要なデータの蓄積やアクセス権限の付与を避けなければなりません.

VMホスティングサービス並びにホームページサービスでは,後述するMySQLなどのリレーショナルデータベースを利用するオプションを用意しています.

SQL言語とクエリ

SQL言語はリレーショナルデータベースでデータの操作を命令するためのデータベース言語です.ここで,データベースへの操作命令をクエリと呼びます.リレーショナルデータベースではSQLで記述したクエリがDBMSに送られる事で,データベースの操作や管理が実行されます.

代表的なSQLの命令を紹介します.

  • 検索(SELECT)
  • 追加(INSERT)
  • 更新(UPDATE)
  • 削除(DELETE)
  • テーブルの作成(CREATE TABLE)
  • 情報を見る(SHOW)

SQLの命令を使用してクエリを作成します.クエリの文は1つのSQL命令と複数のオプションで構成され最後に";"をつけます.なお,クエリの終端を示す";"が入力されるまでは1つのクエリとして認識されますので,SQLの文の途中で自由に改行を加えてもかまいません.

ここでは簡単なSQLの例としてkyoto-uテーブルを作成し,レコードを追加した上で検索をかけてみましょう.テーブルの作成はCREATE TABLE文です.
CREATE TABLE kyoto-u(id int not null, name varchar(20) not null, primary key(id)); このクエリが実行されれば,int(整数)型のフィールドidとvarchar(文字列)型のフィールドnameで構成され,プライマリキーをidフィールドとするkyoto-uテーブルが作成されます.

次にINSERT文を使ってこのテーブルにレコードを追加していきましょう.このテーブルのフィールドはid・name共にnot null指定のオプションが加えられていますので,INSERT時に両方のフィールドに必ずパラメータを入れる必要があります.
INSERT INTO kyoto-u(id,name) VALUES(1,"京大太郎");
INSERT INTO kyoto-u(id,name) VALUES(2,"京大花子");
このクエリを実行すればkyoto-uテーブルに京大太郎と京大花子の2人が登録されます.

それでは作成したテーブルから目的の情報を検索するためにSELECT文を使用してみましょう. SELECT id,name FROM kyoto-u; このクエリを実行すればkyoto-uテーブルに蓄積されているデータからidフィールドとnameフィールドについての対応の一覧表が出力されます.

ここでこのクエリにオプションを加え次のようにしてみましょう. SELECT id,name FROM kyoto-u WHERE name="京大花子"; このクエリを実行すればkyoto-uテーブルに蓄積されているデータの中からnameフィールドの内容が"京大花子"のレコードのみidフィールドとnameフィールドについての対応の一覧表が出力されます.

以上のようにクエリをSQL言語で入力する事によりデータベースを操作する事ができます.なお,SQL言語についての詳細は,参考図書などをご覧ください.

MySQLによるデータベースの利用

では,実際にMySQLを例にリレーショナルデータベースを使ってみましょう.ここではMySQLサーバがすでに構築されて起動しているものとして話を進めます.

まずはMySQLのデータベースへアクセスしてみましょう.端末画面を開いて以下のように入力してみてください. mysql -u root -p
パスワードの入力
mysql>と表示されればログイン完了です.
(以下mysql内での入力に関してはmysql>と表記しています)

初回ログイン時はrootユーザにパスワードが設定されていないので-pのオプションは不要です.セキュリティの確保のためパスワードを設定してください.パスワードの設定は次のように入力します.
mysql>set password for root=password('設定するパスワード');
mysql>flush privileges;

MySQLのユーザを登録するには次のように入力します. mysql>grant all on *.* to ユーザ名 identified by "ユーザのパスワード";
mysql>flush privileges;
ここで,「all on *.*」の部分はデータベースのユーザ権限を示しています.all指定はこのユーザがgrant権限以外の全ての権限を持っている事を示しています.onより先は権限が及ぶデータベース名とテーブル名の指定です.「*」になっているので,このMySQLサーバにある全てのデータベースとテーブルに権限が及びます.命令文のオプションのパラメータを変える事でユーザに応じてデータベースの利用権限を制限する事ができます.

では実際にサーバの中にデータベースを作成しましょう. mysql>CREATE DATABASE univ; このように入力すればunivというデータベースが作成されます.

これで,MySQLのユーザとデータベースの作成が終わりました.rootでのデータベースへのアクセスを切断し,新しく作ったユーザでunivデータベースにアクセスしましょう.データベースから抜けだすにはexitコマンドを使います. mysql>exit; これで通常の端末画面に戻ります.

端末画面から再度MySQLにログインします.今度のログインには,rootではなく作成したユーザ名を使用します. mysql -u ユーザ名 -p univ
パスワードの入力
前回のログインと異なるのは接続する時に直接データベースを指定してログインした事です.もし前回の様にデータベースを指定せずにログインした場合は,ログイン後にUSEコマンドでデータベースを指定します. mysql>USE univ;

またMySQLのサーバへは,-hオプションを使う事でネットワークを介してリモート接続する事もできます.端末画面やWindowsのコマンドプロンプトから次のように入力します. mysql -h アドレス -u ユーザ名 -p univ
パスワードの入力
リモート接続は大変便利な機能ですが,利用する場合はパスワード管理などセキュリティに十分注意してください.また,あらかじめファイアーウォールの設定でMySQLが使用するポートを開放しておく必要があります.

データベースに接続できたら,実際にSQL言語でクエリを作成しデータベースを操作してみましょう.SQL言語についての詳細は,参考図書などをご覧ください.

参考図書紹介

  • MySQL徹底攻略ガイド
    著者:志村伸弘 発行:技術評論社
  • 現場で使えるMySQL
    著者:松信嘉範 発行:翔泳社
  • ORACLE SQL入門
    著者:David Lockman 翻訳:MbCD 発行:ASCII
  • SQL92/99 標準リファレンスブック
    著者:マーチン・グルーバ 翻訳:株式会社ドキュメントシステム 発行:ピアソン・エデュケーション

コンテンツ作成ガイドTOPに戻る

2.Webアプリケーションへのデータベースの活用

本節ではデータベースを用いて作成するWebアプリケーションについて,PHPとMySQLの連携を例に解説します.なお,実務的なWebアプリケーションの作成については,本コンテンツの範囲を超えているため記載しておりません.後述する参考図書などをご覧ください.

データベースとWebの連携

前節ではデータベースがデータのみを専門に扱い,アプリケーションの処理要求に対しデータの蓄積や検索などの処理結果を提供する事を説明しました.

このデータベースを利用する対象としてWebアプリケーションも例外ではありません.Webアプリケーションにデータベースを連携させる事により,Webページの画面を通じて処理を実行させる事が可能となります.例えばフォームを利用する事で,送信されてきた内容をもとにデータベースに情報を蓄積・更新したり,キーワードから検索を行い検索結果を表示するなどの処理ができます.

従って,データベースとWebアプリケーションを連携させる事によりWeb上でデータを扱えるため,ネットワークに接続されている様々な場所から処理を実行し,業務をこなせる動的なWebページの作成が可能となります.

データベースと連携したWebアプリケーション

PHPとデータベースで作るWebアプリケーション

PHP言語はデータベースとの連携がとても簡単で,データベースを用いたWebアプリケーションを作成するために必要な機能を多数備えています.特にPHPを利用する場合はWebサーバであるApacheの中のプロセスとして処理されるため,高速に動作する事が期待できます.

アプリケーションの基本的な動作はユーザからの入力に対し処理を行って結果を返します.PHPのWebアプリケーションの場合はクライアント側で入力された内容をWebサーバが受け取り,PHPプログラムの処理をして結果をクライアントのブラウザに表示するという動作になります.従ってPHPとデータベースの連携は,Webサーバ・データベースサーバ間でやりとりが行われる事になります.

データベースとPHPを連携

それでは具体的にPHPとデータベースを連携させてWebアプリケーションを構築していく事を考えていきましょう.

まず初めにWebアプリケーションの利用者から情報を受け付け,データベースに蓄積する事を考えます.Webアプリケーションの場合,利用者からの入力はブラウザに表示されているWebページの入力フォームなどによって獲得します.例えばHTMLの<form>要素を用いてテキストエリアやラジオボタン・チェックボックスなどによってユーザからの入力を受け付け,POSTやGETなどを用いて処理を行うPHPファイルへ情報を送ります.

情報を受け取ったPHPファイルのスクリプトはデータベースサーバに対し,獲得した情報をデータとして保存するINSERTのクエリを送る処理をします.データベース側から処理結果が返ってくればPHPは処理結果をWeb画面に表示して利用者に伝えます.

レコードを追加する処理

次はデータベースに照会し,蓄積された情報を検索する事を考えます.今度は検索キーワードを入力フォームなどによって利用者から獲得し,POSTやGETなどを用いて処理を行うPHPファイルへ情報を送ります.

情報を受け取ったPHPファイルのスクリプトはデータベースサーバに対し,獲得した情報をキーワードに検索を行うSELECTのクエリを送る処理をします.データベース側から結果が返ってくればPHPは検索結果をWeb画面に表示して利用者に伝えます.

レコードを検索する処理

最後に,データベース内の情報の更新や削除といった既存データの操作を行う事について考えます.この場合はまずデータベースが現在どのようなレコードを持っているかを利用者に対し示してから,更新や削除といった指示を仰ぎます.

ですから,まず初めにPHPスクリプトではSELECTのクエリをデータベースに送り全レコードの一覧を要求して,その結果を表示します.その結果の下にデータをどう処理するのかを入力するフォームを備え,フォームに入力された利用者の指示をPOSTやGETなどを用いて処理を行う別のPHPファイルへ情報を送ります.

情報を受け取ったPHPファイルはデータベースへUPDATEやDELETEのクエリを送る処理を行い,データベースから返ってきた実行結果を表示して利用者に伝えます.

レコードを更新・削除する処理

以上の3つの処理を組み合わす事でPHPとデータベース連携による基本的なWebアプリケーションで業務の実行を実現できます.以下に具体的なPHP・データベース連携のWebアプリケーション実施例を示します.

  • BBS(掲示板)
  • チャットシステム
  • セミナーなどの予約受付
  • アンケート調査
  • 図書館の蔵書検索
  • ユーザ専用ページ認証

サーバサイドスクリプトにおけるセキュリティ対策の必要性

PHPなどサーバ内で動作するサーバサイドスクリプトでは,クライアント側の入力をもとにサーバ側で処理を行います.

ここで,データベースと連携しているプログラムは,データベースへのアクセス権限を持っています.すると,Webアプリケーションのプログラムの隙があればSQLインジェクションなどの攻撃手法によって脆弱性を突かれる事により,本来プログラムの作者が予期していなかった処理が実行され,データベースの改ざんや不正な処理結果への誘導といった攻撃を受けてしまう事につながります.

データベースは情報の宝庫であるため,これらの攻撃によって情報漏洩やデータ改ざんなどの被害を受けないよう特に注意する事が必要です.実装したPHPプログラムに対し,セキュリティホールが無いかどうか十分に確認しなければなりません.

なお,セキュリティ対策についてはコンテンツ作成ガイド内でも所々で紹介していますが,日々新しい攻撃手法が考え出され対処方法もそれに併せて次々と変化していくため,本コンテンツでは対応しきれません.プログラムのセキュリティ対策についての具体策は専門の書籍(なるべく最新のものを読むようにしてください)を参考にして行ってください.

PHPでMySQLを使うには

ここからはMySQLを例にPHPでデータベースを利用する方法について説明します.

PHP言語ではプログラム内でMySQLのクエリを実行する事ができます.まず初めにPHPのプログラムからMySQLへリモート接続します.接続にはPHPのmysql_connect関数を使います.この関数では,引数としてMySQLの『接続先アドレス』『ユーザ名』『パスワード』の3つを入れます.

接続に成功した場合,次の命令はデータベースの選択です.mysql_select_db関数で使用するデータベースを指定します.MySQLとやりとりを行う処理では,失敗した時にechoでその旨を表示できるようにしておくと良いでしょう.
以下に接続からデータベースの選択までのPHPプログラムの例を示します.

データベース接続の実行

MySQLにクエリを送る処理はmysql_query関数を使用します.クエリは直接この関数を用いて送るのではなく,あらかじめクエリ格納用に変数を用意しておき,一度格納して変数から関数を利用した方が良いです.
以下にMySQLからデータを検索して結果を表示するPHPプログラムの例を示します.

サンプルプログラム

実務的なPHPプログラムの作成並びに関数のリファレンスに関しては参考図書などをご覧ください.

参考図書紹介

  • 独習テキスト完全理解 SQL Webデータベース
    著者:豊崎直也 発行:株式会社すばる舎
  • MySQL×PHPによる本格Web-DBシステム入門
    著者:館岡佐到士 監修:(株)ソフトエイジェンシー 発行:技術評論社
  • Webアプリセキュリティ対策入門 ?あなたのサイトは大丈夫?
    著者:大垣靖男 発行:技術評論社

コンテンツ作成ガイドTOPに戻る

 

Copyright © Institute for Information Management and Communication, Kyoto University, all rights reserved.