データベース関係クラスの使用(1) DB編

DBクラス

DBクラスは、a-blog cmsで使用しているデータベースへの接続を支援するクラスです。

インスタンスの作成

// DBクラス
$DB = DB::singleton(dsn());

dsn関数は、a-blog cmsの組み込み関数で、config.server.phpに保存されているデータベース情報を、連想配列で返します。以降のサンプルで紹介されている箇所以外で、使用することはほとんどありません。

クエリーの発行

基本的なクエリーの発行と、結果を全件取得するサンプルを下記に示します。

テーブル名の接頭辞は config.server.php の DB_PREFIX で決まります(インストーラーの既定値は acms_ です)。SQL を文字列で直接書くときは、acms_ を直書きせず DB_PREFIX を使ってください。接頭辞を変えた環境では、直書きしたテーブル名が見つからずクエリーが失敗します(all は空の配列、それ以外は false が返るだけで、気づきにくい点に注意)。SQL クラス(データベース関係クラスの使用(2))は、接頭辞を自動で付けます。

$DB = DB::singleton(dsn());
$q = 'SELECT * FROM `' . DB_PREFIX . 'entry` LIMIT 0, 10';

/**
 * query
 * @param string $query
 * @param string $mode
 * @return mixed $response
 */

// クエリーの結果を全件取得する
$all = $DB->query($q, 'all');

クエリー発行の各モードの挙動

queryメソッドは、複数のモードを持ちます。それぞれのモードで、返り値が異なります。

all - 結果から全行を取得

結果を多次元配列として、全行取得します。

$q = 'SELECT * FROM `' . DB_PREFIX . 'entry` LIMIT 0, 10';
$all = $DB->query($q, 'all');

var_dump($all);
/*
dumpの結果

array(10)(
    [0] => array(21)(
        'entry_id' => 1,
        'entry_title' => 'サンプルレコード',
        'entry_code' => 'entry-1.html',
        ...
    ),
    [1] => array(21)(
        'entry_id' => 2,
        'entry_title' => 'サンプルレコード2',
        'entry_code' => 'entry-2.html',
        ...
    ),
    [2] => array(21)(
        'entry_id' => 3,
        'entry_title' => 'サンプルレコード3',
        'entry_code' => 'entry-3.html',
        ...
    ),
    ...
);
*/

row - 結果から1行を取得

結果から1行のみ取得します。結果が複数行だった場合は、先頭の1行を連想配列で返します。

$q = 'SELECT * FROM `' . DB_PREFIX . 'entry` WHERE `entry_id` = 1';
$row = $DB->query($q, 'row');

var_dump($row);
/*
dumpの結果

array(21)(
    'entry_id' => 1,
    'entry_title' => 'サンプルレコード',
    'entry_code' => 'entry-1.html',
    ...
)
*/

one - 結果から1つの値を取得

結果から1つの値を取得します。結果が複数列をもつ場合は、先頭列の値を取得します。また、結果が複数行であった場合は、先頭の1行が対象行となります。

$q = 'SELECT `entry_title` FROM `' . DB_PREFIX . 'entry` WHERE `entry_id` = 1';
$one = $DB->query($q, 'one');

var_dump($one);
/*
dumpの結果 

string "サンプルレコード"
*/

fetch - 結果を1行ずつ取得

結果を1行ずつ取得できるように、クエリーの結果を DB インスタンス内で保持します。保持された結果は、fetch メソッドで1行ずつ取得します。取得すべき結果が無くなったときは false を返します。

fetch メソッドには、query に渡したものと同じ内容の配列(sql と params)を渡します。SQL の文字列を渡しても取得できません。

なお、fetch は非推奨です(パフォーマンスの問題)。1 行ずつ取得したいときは、exec で結果(PDOStatement)を受け取り、next で取り出す書き方をおすすめします。

$statement = $DB->query('SELECT * FROM `' . DB_PREFIX . 'entry` LIMIT 0, 10', 'exec');
while ($row = $DB->next($statement)) {
    echo $row['entry_title'] . "\r\n";
}
$q = [
    'sql' => 'SELECT * FROM `' . DB_PREFIX . 'entry` LIMIT 0, 10',
    'params' => [],
];
$DB->query($q, 'fetch');

while ($row = $DB->fetch($q)) {
    echo $row['entry_title'] . "\r\n";
}

/*
echo の結果

サンプルレコード
サンプルレコード2
サンプルレコード3
...
..
.

*/

exec - クエリーを実行する

クエリーを実行し、成功したときは PDOStatement(結果のリソース)を、失敗したときは false を返します。INSERT、UPDATE、DELETE などの発行時に使用します。成否は false との比較で判定してください。=== true で判定すると、成功しても PDOStatement が返るため失敗扱いになります。

$q = 'INSERT INTO `' . DB_PREFIX . 'entry` (col1, col2, col3....) VALUES(val1, val2, val3...)';
$res = $DB->query($q, 'exec');
if ($res === false) {
    // fail
} else {
    // success
}