PHPとデータベースサーバとの接続方法について
今回は下図の赤枠にある(PHPとデータベースサーバ)の動作について実際のソースコードを見ながら詳しく解説していきます。
- データベースサーバとはなに?
- データベースにも種類がある?
- リレーショナルデータベース管理システム(RDBMS)とはなに?
- PHPでデータベースを使用するには?
・データベースの接続のコード
・SQLの実行のコード
なお、本稿はデータベース主体になりますのでRDBMSやSQLなど予備知識があると内容が入りやすい記事かと思います。
※RDBMSやSQLなどは補足として記載してあります。
①データベースサーバとはなに?
データベースサーバとはシステムで使用するデータを管理し、データの検索更新、保存、バックアップ、読み取り一貫性の保証を行うサーバのことです。アプリケーションサーバからの要求に基づきデータの検索や更新(追加、修正、削除)などを行っています。
データベースサーバにデータを保持しておき、必要な時に取り出せる様に出来れば開発やメンテナンスが楽になるメリットがあります。
大規模なデータを扱う以上、データベースを使用する事が前提になっています。
②データベースにも種類がある?
データベースサーバに使用するデータベースには様々な種類がありますのでいくつかご紹介いたします。
・MySQL(マイ・エス・キュー・エル)
・MariaDB(マリア・デー・ビー)
・PostgreSQL(ポストグレ・エス・キュー・エル)
・ORACLE Database(オラクル データベース)
・Microsoft Access(マイクロソフト アクセス)
・Microsoft SQL Server(マイクロソフト エス・キュー・エル・サーバ)
・SQLite(エス・キュー・ライト)
※ほかにも種類がありますが説明の都合上、リレーショナルデータベース管理システム(RDBMS)に絞っています。
列挙した中でも高いシェア率を誇っているのがORACLE DatabaseとMySQLです。
※シェア率の調査は以下のサイトを参考にしました。
【参考文献】DB Enginesシェア率が高く、かつオープンソースであることから弊社でもMySQLを利用しております。
③リレーショナルデータベース管理システム(RDBMS)とはなに?
データをExcelの様な表形式で扱い、別々の表同士に関係性を持たせることで表同士を結合させ参照することができるデータベースの管理システムです。
主な特徴
- データの一貫性を保つ機能(トランザクション)
操作したデータの一貫性を保つ仕組みとして読み取り一貫性というものがあります。あるトランザクションが変更中のレコードを他のトランザクションが参照したとき、変更前の確定済みのデータを参照させる機能です。
この読み取り一貫性によって、データの整合性を保つことができます。例:トランザクションAが出身地を「東京都」から「千葉県」にUPDATEしている間にトランザクションBがその該当レコードをSELECTすると確定前なので「東京都」となっている。
トランザクションデータベースにおいてデータを検索するやレコードを更新するなどの一連の操作単位です。トランザクションとして実行された処理は、一連のすべての処理が問題なく行われた場合にのみ成功とみなされます。逆に処理の中で不具合が生じた場合には、すべての処理が失敗したものとみなします。
- インデックスによる最短検索
データベースとはいってもデータ数が多くなるにつれ、検索が遅くなってしまいます。そこでインデックスを用いてデータを整理整頓しておくと、何百万件の中からでも最短で目的のデータを検索できます。インデックスは、文字通り本の「索引」のようなもので、目次を使うことで素早く該当のデータを検索できます。
- 条件を指定してデータを検索
在庫数の多い順や少ない順などを上位100件表示。など検索条件を指定して、柔軟に対応することができます。
④PHPでデータベースを使用するには?
PHPはHTML埋め込み言語とも呼ばれており、HTMLコード内にというPHPスクリプトを埋め込むことによって命令文を書くことができます。
以下画像が全体のソースコードです。
上図のようにの中に必要なコードを入れることによってデータベースの接続やSQLの実行が可能になります。
今回のサンプルではデータベースに西船橋太郎が存在していれば画面に表示させる様にしています。
【実行結果】※chromeブラウザでアクセスして表示させています。
■データベースにデータが存在する場合
■データベースにデータが存在しない場合
それでは、ソースコードを「データベースの接続」部分と「SQLの実行」部分でわけて説明します。
データベースの接続
データベースサーバに接続する方法はいくつかありますが、今回はPDOクラスを使用します。
PDO(PHP Data Object)クラス従来は以下のようにデータベースの種類ごとに関数を使い分けていました。
【例】
・MySQLへ接続の場合「mysqli_connect」関数を使用
・PostgreSQLへ接続の場合「pg_connect」関数を使用
PDOクラスを使用すれば、どのデータベースを利用する際も同じ関数が使えます。
PDOクラスを使ったデータベースサーバへの接続は以下のとおりです。
$host = ‘mysal:dhname=対象のデータベース名; host=対象のホスト名;charset=utf8’;
$username = データベースにアクセスするユーザー名;
$passwd = データベースにアクセスするユーザーのパスワード;
try {
//データベースへ接続
$dbh = new PDO($host, $username, $passwd);
print(‘接続に成功しました。’);
データベースサーバに接続するため、以下の認証情報をPDOクラスに渡します。
$host データベースアクセスに必要な情報を設定しています。
・dbname:データベース名
・host:ホスト名
・charset:文字コード ※省略可、サンプルでは「UTF-8」を使用
$username データベースにアクセスするユーザー名
$passwd データベースにアクセスするユーザーのパスワード
接続に成功した場合、「接続に成功しました。」と表示され、次の処理を行います。
なお、パスワードが誤っているなどで接続に失敗した場合、「データベース接続失敗。」と表示され、処理を中断します。
} catch (PDOException $e) {
exit(‘データベース接続失敗。’ . $e->getMessage());
}
SQLの実行
データベースにアクセス可能になったらSQLでデータベースからデータを取得します。
SQL一般的には「エス・キュー・エル」と呼びます。
データベース言語の一つでデータの操作やデータベースを制御するための言語です。SQLはISO(国際標準化機構)で規格が標準化されており、どのRDBMSでも同じように操作ができるという特徴があります。
下図のようにPDOクラスを使用してSQLを実行します。
$id = ‘test1’;
$name = ‘西船橋太郎’;
$stmt->bindValue(1, $id);
$stmt->bindValue(2, $name);
$stmt->execute();
$result = $stmt->fetch();
echo “ユーザ一名 = “.$result[‘name’];
なお、PDOクラスでSQLを実行する場合、2種類のメソッドが存在します。
今回はPrepare(プリペア)メソッドを使用しており、パラメータに変数を使うことでより柔軟に対応することが可能です。
▼usersテーブルからusernameとnameを条件に検索を行います
▼事前に検索条件を変数に設定します
$name = ‘西船橋太郎’;
▼bindValueで一つ目の引数(username = ?)と二つ目の引数(name = ?)に$idと$nameの値を設定しています
$stmt->bindValue(2, $name);
▼executeで実行させます
▼実行した結果を受け取り、$result変数に格納しています
▼取得しただけでは画面に表示できない為、echoで画面に結果を表示させます
【実行結果】
今回は検索条件の値を西船橋太郎に固定させていますが、画面側で入力機能を追加しユーザーによって入力した値を検索条件にする事も可能です。また、今回はサンプルとして使用しませんでしたが、Query(クエリ)メソッドでは以下の様に記載します。
実行方法が2つある理由は以下のとおりです。
Prepareメソッド:
ユーザーによって条件が変動するSQL文を使用する場合に使用します。
変動する事によって柔軟な対応が可能となりますが、SQLインジェクション(ユーザーによる悪意あるSQL)の対策も必要になります。Prepareメソッドは検索条件の値をエスケープ処理をする事によってSQLインジェクションを防ぐことが出来る仕組みになっています。
Queryメソッド:
ユーザーによって条件が変動しない場合に使用します。
今回はPHPとデータベースの接続方法についてでした。
PHP単体でも開発は可能ですが、データベースを使用することによってより良く便利なシステムを開発することができます。
前回の記事と比べ難しい単語などが出てきていますが、興味がある場合は調べてみてください。長くなってしまいましたが、PHPとデータベースの関連についてでした。