Twitter ログイン機能についてのお知らせ

2016年1月28日現在、Twitter公式の仕様変更によりTwitterログイン機能をご利用いただけません。

次回リリースのバージョンで対応させていただく予定です。ご迷惑をおかけして恐縮ですが、ご理解のほどよろしくお願い申し上げます。

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

DBクラス

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

インスタンスの作成

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

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

クエリーの発行

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

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

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

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

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

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

all - 結果から全行を取得

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

$q = '`SELECT * FROM `acms_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 `acms_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 `acms_entry` WHERE `entry_id` = 1';
$one = $DB->query($q, 'one');

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

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

fetch - 結果を1行ずつ取得

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

fetchメソッドの返り値はrowモードと同じ挙動を示しますが、取得すべき結果が無くなった場合は、falseを返します。

$q = '`SELECT * FROM `acms_entry` LIMIT 0, 10';
$DB->query($q, 'fetch');

/**
 * fetch
 * @param string $query
 * @return array $row
 */
while ( $row = $DB->fetch($q) ) {
   echo $row['entry_title']."\r\n";
}

/*
echo の結果

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

*/

exec - クエリーの成否をbooleanで取得

クエリーの成否のみをbooleanで返します。INSERT、UPDATE、DELETEなどの発行時に使用します。

$q = 'INSERT INTO acms_entry (col1, col2, col3....) VALUES(val1, val2, val3...);'
$res = $DB->query($q, 'exec');

if ( $res == true ) {
   // success
} else {
   // fail
}

データベース関係クラスの使用(2) SQL Select編

SQLクラス

SQLクラスは、a-blog cmsで使用しているSQL文の作成を支援するクラスです。DBクラスとあわせて使用します。今回はSelect文を発行するケースで順にサンプルを紹介します。

基本のSELECTからテンプレートへの追加まで

// Templateクラス
$Tpl = new Template($this->tpl, new ACMS_Corrector());

// DBクラス @dsn()はconfig.server.php で定義されたデータベース情報を返します
$DB = DB::singleton(dsn());

// SQLクラス
$SQL = SQL::newSelect('entry');

// 対象の列を設定
$SQL->addSelect('entry_title');
$SQL->addSelect('entry_datetime');

// SQLを組み立てる
$q = $SQL->get(dsn());

// クエリーを実行して結果を取得
$all = $DB->query($q, 'all');

// 取得したデータをentry:loopとしてテンプレートに追加
foreach ( $all as $row ) {
    $Tpl->add('entry:loop', $row);
}

return $Tpl->get();

日付が新しい順に並び替えて10件取得する

$SQL =  SQL::newSelect('entry');

$SQL->addSelect('entry_title');
$SQL->addSelect('entry_datetime');

// エントリーの日付で降順に並び替える
$SQL->setOrder('entry_datetime', 'DESC');

// 取得数を10までに制限する
$SQL->setLimit(10);

$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');

?>

カテゴリーごとにエントリーの数をカウントする

$SQL = SQL::newSelect('entry');

// 合計をカウントする ( MAX・MINなど集計関数 )
$SQL->addSelect('*', 'amount', null, 'COUNT');

// カテゴリーIDでグループする
$SQL->setGroup('entry_category_id');

$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');

WHEREの処理

entry_blog_idが1のエントリー

$SQL = SQL::newSelect('entry');
$SQL->setSelect('*');


// 第三引数以降は省略できます
$SQL->addWhereOpr('entry_blog_id', 1, '=', 'AND');

$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');

entry_category_idが1 または entry_user_idが1のエントリー

$SQL = SQL::newSelect('entry');
$SQL->setSelect('*');

// entory_category_idが1
$SQL->addWhereOpr('entry_category_id', 1);

// または entry_user_idが1
$SQL->addWhereOpr('entry_user_id', 1, '=', 'OR');

$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');

entry_statusがdraft(下書き) か close(非公開)であるエントリー

$SQL = SQL::newSelect('entry');
$SQL->setSelect('*');

// draft か close である ( IN )
$SQL->addWhereIn('entry_status_id', array('draft', 'close'));

$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');

title, body, nameのいずれかに指定した文字列を含むコメント

$keyword   = 'hogehoge';

$SQL = SQL::newSelect('comment');
$SQL->addSelect('*');

$SQL->addWhereOpr('CONCAT(comment_title, comment_body, comment_name)', "%$keyword%", 'LIKE');

$q = $SQL->get(dsn());
$all = $DB->query($q, 'all');