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 ↵ 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 ↵ 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 ↵ protected _query (String): "SHOW PROCESSLIST" (16 characters) protected _result (Array, 1 element) ↵ 0 (Array, 8 elements) ↵ 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 送信し、マージされました。