FuelPHP で SHOW DATABASES

FuelPHP で SHOW DATABASES をしたい。
専用のメソッドはないようなので \DB::query を使います。

$ php oil -v
Fuel: 1.8-dev running in "development" mode

問題

\DB::query('SHOW DATABASES')->execute();// var_dump すると int(5) のように数値が返ってくる

を実行してもデータベース名らしきデータが返ってきません。

解決方法

\DB::query('SHOW DATABASES', \DB::SELECT)->execute();

とすることでデータベース名を含む配列が返ってくるようになります。

理由

Database_Query の $this->_type を \DB::SELECT にする必要があるのですが
\DB::query の第2引数を空にするとコンストラクタで $this->_type に null が入ります。
SHOW の場合以下の箇所で $this->_type が上書きされないので \DB::SELECT になりません。

// fuel\core\classes\database\query.php L261
switch(strtoupper(substr(ltrim($sql,'('), 0, 6)))
{
  case 'SELECT':
    $this->_type = \DB::SELECT;
    break;
  case 'INSERT':
  case 'CREATE':
    $this->_type = \DB::INSERT;
    break;
}

今はドキュメントが修正されていますが元々はデフォルトが DB::SELECT である旨書かれていたようなので
case default: を追加したらいいようにも思いますがどうなんでしょうか。

【参考】
FuelPHP DB::query() の使い方 ~ SQL クエリタイプの指定


カテゴリー: FuelPHP タグ: パーマリンク