FuelPHP DB::query() の使い方 〜 SQL クエリタイプの指定

FuelPHP+MySQLでSHOWコマンドの結果を取得 - BTT's blog に DB::query() だと、SHOW PROCESSLIST や SHOW WARNINGS などの SHOW コマンドの結果が取れないという記述がありました。

これは、DB::query() の第2引数に適切な SQL クエリタイプを指定していないためです。

<?php
class Controller_Db extends Controller
{
	public function action_index()
	{
		Debug::$js_toggle_open = true;
		
		$result = DB::query('SHOW PROCESSLIST');
		Debug::dump($result);
		Debug::dump($result->execute());
		
		$result = DB::query('SHOW PROCESSLIST', DB::SELECT);
		Debug::dump($result);
		Debug::dump($result->execute());
	}
}

最初の DB::query('SHOW PROCESSLIST') の場合は、

APPPATH/classes/controller/db.php @ line: 9

Variable #1:
  (Object #20): Fuel\Core\Database_Query &#8629;

    protected _type : null
    protected _lifetime : null
    protected _cache_key : null
    protected _cache_all (Boolean): true
    protected _sql (String): "SHOW PROCESSLIST" (16 characters)
    protected _parameters (Array, 0 elements)
    protected _as_object (Boolean): false


APPPATH/classes/controller/db.php @ line: 10

Variable #1:
  (Integer): 1

_type が null となっており、結果は件数しか取得できません。

一方、次の DB::query('SHOW PROCESSLIST', DB::SELECT) の場合は、

APPPATH/classes/controller/db.php @ line: 13

Variable #1:
  (Object #27): Fuel\Core\Database_Query &#8629;

    protected _type (Integer): 1
    protected _lifetime : null
    protected _cache_key : null
    protected _cache_all (Boolean): true
    protected _sql (String): "SHOW PROCESSLIST" (16 characters)
    protected _parameters (Array, 0 elements)
    protected _as_object (Boolean): false


APPPATH/classes/controller/db.php @ line: 14

Variable #1:
  (Object #37): Fuel\Core\Database_Result_Cached &#8629;

    protected _query (String): "SHOW PROCESSLIST" (16 characters)
    protected _result (Array, 1 element) &#8629;
         0 (Array, 8 elements) &#8629;
             Id (String): "9" (1 characters)
             User (String): "root" (4 characters)
             Host (String): "localhost" (9 characters)
             db (String): "fuel_dev" (8 characters)
             Command (String): "Query" (5 characters)
             Time (String): "0" (1 characters)
             State : null
             Info (String): "SHOW PROCESSLIST" (16 characters)
    protected _total_rows (Integer): 1
    protected _current_row (Integer): 0
    protected _as_object (Boolean): false

_type が 1 となり、結果セットが取得できていることがわかります。


なお、FuelPHP 1.6 のドキュメントは、「タイプが渡されない場合、初期値は DB::SELECT となり」となっていますが、この記述は少々間違っているようです。

本家 1.7 のドキュメントを修正する PR 送信し、マージされました。