データベースの処理は「接続」してその後に、「情報くれ」やら「この情報覚えといて」やら指示を与える操作になります。
「接続」と「操作」に大分類できるわけです。
この決まったパターンがあるわけですから、汎用的に使えるようクラス化しておきたくなりますね。
PHP5からは標準でPDOという拡張モジュールが使えると思うのでこれを使います。
というか、PDO自体クラス化されてるのでPHP実行時にはPDOクラスはロードされてることになります。
ではクラス化する必要ないのかというと、人間は欲張りですからもっと使いやすくしたいという欲望があります。
既存のクラスだとあまりにも汎用的過ぎて、毎回決まった指示工程を与える余計な部分がどうしても出てしまいます。
データベースを使っていると、だいたいMySQLを固定的に使う人だったり、ユーザ名やパスワードも一定だったりするのでできるだけSQL実行までの手間を省きたいというのがあります。
そこで以下の2パターンでクラスを作るように考えました。
どのレベルまで汎化しておくのかが重要です。
1.いろいろなシステムで汎用的に使い回せる親クラス
「接続」を自分のパターンに固定する
「操作」をもっと簡単にできるよう工夫する
2.親クラスを継承して特定のシステムで共通に使い回す子クラス
「接続」はほぼ継承したままで変更の必要なし
「操作」具体的なそのシステム専用のSQL文を親クラスの操作メソッドを流用して書き足す
ではまず親クラスを作ってみます。
先に書いたとおり、実行時にはPDOクラスは定義されてるのでこれを継承したDBクラスを親クラス(PDOから見たら子クラスですが)として作成することにします。
MySQLが起動している状態でこれを実行してみます。
var_dumpの結果
うまく動作しました。
私の場合、DBMSにMySQLを使うのでハードコーディングで固定してしまいました。
また、ユーザはrootでパスワード無しで使うのでこれも固定にしています。
以下のように丁寧に指定したり、別ホスト別スキーマを指定できるよう汎用的な部分も残しています。
でも気になる部分があります。
var_dumpの結果が1つではなく、2要素返ってきています。
これはfetchモードがデフォルトのままなのでご丁寧に「カラム名」と「カラム番号」添字で返してるためです。
無駄が発生するので、「カラム名」のみで返すよう親クラスを修正する必要があります。
あと、大規模システムにありがちな接続ホストやスキーマがいくつも分かれてる場合においても汎用的に使いやすくなるよう工夫する余地があります。
「接続」と「操作」に大分類できるわけです。
この決まったパターンがあるわけですから、汎用的に使えるようクラス化しておきたくなりますね。
PHP5からは標準でPDOという拡張モジュールが使えると思うのでこれを使います。
というか、PDO自体クラス化されてるのでPHP実行時にはPDOクラスはロードされてることになります。
ではクラス化する必要ないのかというと、人間は欲張りですからもっと使いやすくしたいという欲望があります。
既存のクラスだとあまりにも汎用的過ぎて、毎回決まった指示工程を与える余計な部分がどうしても出てしまいます。
データベースを使っていると、だいたいMySQLを固定的に使う人だったり、ユーザ名やパスワードも一定だったりするのでできるだけSQL実行までの手間を省きたいというのがあります。
そこで以下の2パターンでクラスを作るように考えました。
どのレベルまで汎化しておくのかが重要です。
1.いろいろなシステムで汎用的に使い回せる親クラス
「接続」を自分のパターンに固定する
「操作」をもっと簡単にできるよう工夫する
2.親クラスを継承して特定のシステムで共通に使い回す子クラス
「接続」はほぼ継承したままで変更の必要なし
「操作」具体的なそのシステム専用のSQL文を親クラスの操作メソッドを流用して書き足す
ではまず親クラスを作ってみます。
先に書いたとおり、実行時にはPDOクラスは定義されてるのでこれを継承したDBクラスを親クラス(PDOから見たら子クラスですが)として作成することにします。
<?php
// 親クラス
class DB extends PDO
{
public function __construct($host='', $dbname='') {
if (empty($host)) $host = 'localhost';
if (empty($dbname)) $dbname = 'mysql';
try {
parent::__construct("mysql:dbname={$dbname};host={$host}", 'root', '');
} catch (PDOException $e) {
die($e);
}
}
}
// 動作確認
$db = new DB();
$sth = $db->query("select 1");
$row = $sth->fetch();
var_dump($row);
// 親クラス
class DB extends PDO
{
public function __construct($host='', $dbname='') {
if (empty($host)) $host = 'localhost';
if (empty($dbname)) $dbname = 'mysql';
try {
parent::__construct("mysql:dbname={$dbname};host={$host}", 'root', '');
} catch (PDOException $e) {
die($e);
}
}
}
// 動作確認
$db = new DB();
$sth = $db->query("select 1");
$row = $sth->fetch();
var_dump($row);
MySQLが起動している状態でこれを実行してみます。
var_dumpの結果
array(2) {
[1]=>
string(1) "1"
[2]=>
string(1) "1"
}
[1]=>
string(1) "1"
[2]=>
string(1) "1"
}
うまく動作しました。
私の場合、DBMSにMySQLを使うのでハードコーディングで固定してしまいました。
また、ユーザはrootでパスワード無しで使うのでこれも固定にしています。
以下のように丁寧に指定したり、別ホスト別スキーマを指定できるよう汎用的な部分も残しています。
$db = new DB("localhost", "mysql");
でも気になる部分があります。
var_dumpの結果が1つではなく、2要素返ってきています。
これはfetchモードがデフォルトのままなのでご丁寧に「カラム名」と「カラム番号」添字で返してるためです。
無駄が発生するので、「カラム名」のみで返すよう親クラスを修正する必要があります。
あと、大規模システムにありがちな接続ホストやスキーマがいくつも分かれてる場合においても汎用的に使いやすくなるよう工夫する余地があります。