Fuelphp:Agentクラスでエラーが起きた場合の対処方法

FuelphpAgentクラスを使用している時にエラーが起きたことがあったので、
そのエラーが起きた時の対処方法をメモします。

FuelphpのAgentクラスを使用していると、古いバージョンの場合にエラーが起きる可能性があります。

下記のようなエラーが発生しました。

Warning!

ErrorException [ Warning ]: file_get_contents(http://browsers.garykeith.com/stream.asp?Lite_PHP_BrowsCapINI) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 410 Gone

COREPATH/classes/agent.php @ line 446:

445:	ini_set('user_agent', 'Fuel PHP framework - Agent class (http://fuelphp.com)');
446:	$data = file_get_contents(static::$config['browscap']['url']);
447:	default:

UserAgentを判定する時に使用するURL(browscapファイル)のサイトが閉鎖してしまったようで
URLが変更になっておりました。

このようなエラーが起きた場合は、取得するURLを変更する必要があります。

下記に対処方法を記述します。


FuelphpのAgentクラスでエラーが起きた場合の対処方法

コアクラスの「fuel/core/config/agent.php」で読み込むファイルを指定しているので、
オーバーライドして「fuel/app/config/agent.php」を作成(コピー)します。

次のURLを読み込むように変更します。

http://browscap.org/stream?q=Lite_PHP_BrowsCapINI

ファイルをコピーしたら下記のように変更します。

変更前

<?php

return array(

    'browscap' => array(

        'enabled' => true,

        'url' => 'http://browsers.garykeith.com/stream.asp?Lite_PHP_BrowsCapINI',

        'method' => 'wrapper',

        'file' => '/tmp/php_browscap.ini',
    ),

「url」で指定しているファイルを変更します。

変更後

<?php

return array(

    'browscap' => array(

        'enabled' => true,

        'url' => 'http://browscap.org/stream?q=Lite_PHP_BrowsCapINI',

        'method' => 'wrapper',

        'file' => '/tmp/php_browscap.ini',
    ),

上記のように変更し、サーバにアップすればエラーが出なくなります。


また、下記の方法でもOKです。

browscapファイルをダウンロードし、ローカルに設置したファイルを読み込みます。

※「fuel/app/config/lite_php_browscap.ini」に設置した場合

<?php

return array(

    'browscap' => array(

        'enabled' => true,

        'url' => 'http://browscap.org/stream?q=Lite_PHP_BrowsCapINI',

        'method' => 'local',

        'file' => APPPATH . 'config/lite_php_browscap.ini',
    ),

「method」を「local」に変更し、
「file」に読み込むファイル「lite_php_browscap.ini」を
指定すればダウンロードしたファイルを読み込むことができます。


Agentクラスを使用してエラーが起きた場合はチェックしてみてください。

Fuelphp:エスケープしないでSQLを実行する「DB::expr()」

Fuelphpでデータベースの値を操作する場合は、DBクラスを使用します。

そのDBクラスを使用してデータを取得すると、自動でエスケープ処理をかけてくれます。
しかし、状況によってはエスケープしないでデータを取得したい場合があります。

DB::expr()メソッドを使用すればエスケープ処理しないで実行することができます。

MySQLの関数で「COUNT()」「SUM()」「RAND()」などを使用したい場合や
サブクエリを使用してデータ取得する場合などに非常に便利です。

下記に、Fuelphpの「DB::expr()メソッドを使用してデータを取得した時の方法をメモします。


expr()メソッド

エスケープ処理をしないで実行することができます。

DB::expr('クエリ文字列')

「DB::expr()」の実行例(MySQL関数を使用した場合)

・「COUNT()」関数を使用して行数を取得する場合

$query = \DB::select(\DB::expr('COUNT(*) AS cnt'))->from('user');
$result = $query->execute()->as_array();

実行したSQL文

SELECT COUNT(*) AS cnt FROM `user`

・「SUM()」関数を使用して合計値を取得する場合

$query = \DB::select(\DB::expr('SUM(point) AS total'))->from('user');
$result = $query->execute()->as_array();

実行したSQL文

SELECT SUM(point) AS total FROM `user`

・「RAND()」関数を使用してデータをランダムに取得する場合

$query = \DB::select()->from('user');
$query->order_by(\DB::expr('RAND()'));
$result = $query->execute()->as_array();

実行したSQL文

SELECT * FROM `user` ORDER BY RAND()

「DB::expr()」を使用すると上記のようなMySQLの関数を使用することができます。

以前はデータを取得した後にPHPで件数や合計値などを計算してました。
「DB::expr()」を使用するとSQL側で計算等ができるのでとても便利です。

他にも複雑なSQL文を実行する時など色々な使い方ができそうです。

しかし、エスケープ処理がされないので入力した値などを使用してデータを処理する場合は注意です。
その際は「DB::escape()」メソッドでエスケープするなどの処理が必要になります。

Fuelphp:selectメソッドで別名(エイリアス)を付けたデータ取得

FuelphpDBクラスselectメソッドを使ってデータを取得する時に、
フィールド別名エイリアス)を付けてデータを取得する方法をメモします。

複数のテーブルをJOINしてデータを取得するとフィールド名が重複してしまうことがあります。
その際は、重複したフィールド名に別名(エイリアス)を付けてデータを取得すると思います。

SELECT文を実行する時に「AS句」を使用すればフィールド名に別名を付けることができます。

SQL文をそのまま記述してもいいのですが、Fuelphpの「DB::select」で
別名を付けてデータを取得する方法がありました。

下記にそのフィールド名に別名を付けた時の方法を記述します。


別名(エイリアス)を付けたデータ取得

「DB::select」のフィールド名の指定の箇所に
配列で指定すると別名を付けることができます。

下記のように配列を指定します。

DB::select(array('列名', '別名'))->from('テーブル名')

使用方法

エイリアスを指定したい列は配列で指定します。

$query = DB::select('id', array('name', 'user_name'))->from('user');
$result = $query->execute()->as_array();

実行されるSQL文

SELECT `id`, `name` AS `user_name` FROM `user`

・JOINを使用する場合

$query = DB::select('user.id', array('user.name', 'user_name'), array('group.name', 'group_name'))->from('user');
$query->join('group', 'LEFT');
$query->on('user.group_id', '=', 'group.id');
$result = $query->execute()->as_array();

実行されるSQL文

SELECT `user`.`id`, `user`.`name` AS `user_name`, `group`.`name` AS `group_name` FROM `user` LEFT JOIN `group` ON (`user`.`group_id` = `group`.`id`)

Fuelphp:Imageクラスを使用し、画像を回転する「rotate」

FuelphpImageクラスを使用すると、簡単に画像回転させることが可能です。

iPhoneで撮影した画像をアップロードし、ページに表示すると横に表示されてしまうことがあり、
アップロードした画像を回転させる必要がありました。

FuelphpImageクラスを使用して、読み込んだ画像を回転させて保存する方法をメモします。


rotate()

ロードした画像を時計回りに回転します。
パラメータに回転する角度を指定します。

・時計回りに90度回転する場合

rotate(90)

※反時計回りの場合は「-90」


Imageクラスのrotate()で画像を回転

回転したいファイルをロードし、「rotate()」で回転する角度を指定します。

// ファイルパスを指定
$f_path = '/home/hoge/public/uploads/sample.jpg';

// ファイルを読み込む
\Image::load($f_path)
	->rotate(90)	// 時計回りに90度回転
	->save($f_path);	// 画像の保存

上記の方法で画像を回転して保存することが可能です。


他にもImageクラスを使用すればリサイズやトリミングなど簡単に画像を加工することできます。

Fuelphp:fuelphpでJOINしてデータを取得する方法

FuelphpQuery_Builder_Selectクラスjoinメソッドを使用しました。

データベースからデータを取得する際に複数のテーブルを結合して、
データを取得することがあります。

JOINを使用すれば異なるテーブルを結合してデータを取得することが可能です。

下記にFuelphpjoinメソッドを使用して、複数テーブル結合しデータを取得する時の方法をメモします。


Fuelphpで複数のテーブルをJOINしてデータを取得

joinメソッドonメソッドの記述方法は下記のようになります。

joinメソッド

join('テーブル', 'タイプ')

タイプには「INNER」「LEFT」「RIGHT」などを指定します。

onメソッド

on('テーブル.カラム', '=', 'テーブル.カラム')

※テーブル「item」「item_detail」をJOINする場合

・itemテーブルのデータを取得する場合

$query = \DB::select()->from('item');
$res = $query->execute()->as_array();
SELECT * FROM `item`;

・itemテーブルとitem_detailテーブルをJOINしてデータを取得する場合

$query = \DB::select()->from('item');
$query->join('item_detail', 'LEFT');
$query->on('item.id', '=', 'item_detail.item_id');
$res = $query->execute()->as_array();
SELECT * FROM `item` LEFT JOIN `item_detail` ON (`item`.`id` = `item_detail`.`item_id`);