ご無沙汰のFuelPHP

FuelPHPご無沙汰してます。
ブログの更新もご無沙汰していました。

最近FuelPHPを使ったプロジェクトが一段落し、落ち着いていたらなんと!
本番にもろエラーが出力されてましたwwww
忘れてました!

FuelPHPは何もしないと、エラーを優しく丁寧に教えてくれるので、そのまま出力してリリースすると結構とんでもないことになります。

あああぁ、やっちまった/( ^o^ )\ なんてこったい

ということでエラーを出ないように調整。

今回はPDO使ってDBを参照しているんだけども、PHPでのエラー出力は、例外処理の出力と違う!ってわけで、
PHPのエラー出力を制御しても、DB系のエラーでます!

例えば、変なクエリー「 WHERE id in (1,2,)」こんなのが流れてきた場合、PHPのエラーを出力しないようにしてもちゃんと教えてくれます!優しいです!!!てか、当たり前だ!!気づけよもっと前に!

って気づいた後に、あわわわわわわってなって対策しました。


PHPエラーが出ないようにする
こっちは簡単。
publicのindex.php

error_reporting(0);
ini_set('display_errors', 0);

を追記これでPHP系のエラーはでないはず、、、

SQLエラーがでないようにする
PDOの場合、DBのエラーは,Database_Exceptionで管理されているので、こいつを拡張する。

Bootstrapに

Autoloader::add_classes(array(
	// Add classes you want to override here
	// Example: 'View' => APPPATH.'classes/view.php',
        'Database_Exception' => APPPATH.'classes/exception.php',//追記
    ));

「fuel\app\classes」直下にexception.phpというファイルを作成

class Database_Exception extends Fuel\Core\Database_Exception {
    
    public function __construct($message="" , $code="", $e="")
    {
        \Log::error('SQL ERROR',$message . "   " . $code . "   " . $e);
        exit;
    }    
}  

と記述。

例外処理が出た場合にログ出力してexitするようにした。
ログは「fuel\app\logs\年月日」に出るよ

てか、即席なのでこんなんでいいのか不安、、、いい方法教えて下さい。

fuelphpで外部ライブラリを読み込む方法

fuelphp1.7で外部ライブラリを使いたいとき。


今回は、Passwordhashというライブラリを使ってみた。
設置する場所:/fuel/app/vendor/
ファイル名:passwordhash.php

以下は外部ファイルの中身

<?php

class Passwordhash {
...
...
}

このファイルを

これを読み込むときは、controllerなど、そのファイルを使用したいファイルで
以下のように記述すると使える。

<?php
\Autoloader::add_class('PasswordHash',APPPATH.'vendor/passwordhash.php');

class Controller_Password extends Controller
{
    public function action_index()
    {
        $passhash = new PasswordHash();
    }
}

はい!これで使えるようになりました!!( ^ω^)

fulephpでの独自バリデーション

fuelphp1.7で独自バリデーションクラスを作ったので忘れないようにメモ。

独自のバリデーションを利用したい場合は、
/fuel/app/classes/controller/
直下にバリデーションクラスを記述したファイルを設置する。

自分が設置したファイルは
/fuel/app/classes/controller/myvalidation.php

「_validation_」 というプレフィックスをつけてメソッドを用意する。

ファイルの中身はこんな感じ

<?php
class MyValidation
{
    /**
     * 必須チェック
     * @param array $val
     * @param int $min 最低チェック数
     * @param int $max 最高チェック数
     * @return boolean
     */
    public static function _validation_checkbox_require($val, $min=1, $max=3)
    {
        if (count($val) >= $min && count($val) <= $max)
        {
            return true;
        }
        return false;  
    }
}

コメントを編集する場合は、
/fuel/app/lang/ja/validation.php
に追加

<?php
return array(
    'checkbox_require'  => ':labelを :param:1 つ以上、:param:2 つ以下で選択して下さい。',
);


呼び出すとき

<?php
    $validation = \Validation::forge();
    //独自バリデーションクラスを呼び出し
    $validation->add_callable('MyValidation');
    $validation->add('check' , 'チェックボックス')->add_rule('checkbox_require',1,3);


簡単だったね( ^ω^)

fuelphpでのsession

またまたfuelphp。(fuelphp1.7)
最近fuelをいじっているので、忘れないためにメモメモ。

fuelphpでのsessionはcodeigniterと同じくデフォルトではcookieにデータが書き込まれます。
そして、セッション情報は暗号化されてCookieに埋め込まれるという点も同じ。
セッションが多くなればなるほどcookieの情報が多くなるので注意してください。
多くなる恐れがある場合は、別のドライバを使用しましょう。

ドライバの種類は、cookie,file,db,memcached,redis があります。
別のドライバを利用したい場合は、APP_PATH/config/session.phpというファイルを作成し
以下の様な形式で保存し、'driver'部分を変更します。

<?php
return array(
    'auto_initialize'    => true,
    'driver'        => 'redis',
    'match_ip'        => false,
    'match_ua'        => true,
    'cookie_domain'     => '',
    'cookie_path'        => '/',
    'cookie_http_only'    => null,
    'expire_on_close'    => false,
    'expiration_time'    => 7200,
    'rotation_time'        => 300,
    'flash_id'        => 'flash',
    'flash_auto_expire'    => true,
    'post_cookie_name'    => '',
 
    'cookie'    => array(
        'cookie_name'=> 'fuelcid',
    ),
 
    'file'    => array(
        'cookie_name'        => 'fuelfid',
        'path'            => '/tmp',
        'gc_probability'    => 5
    ),
 
    'memcached'    => array(
        'cookie_name'=> 'fuelmid',
        'servers'    => array(    
          'default' => array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100)
      ),
    ),
 
    'db'     => array(
        'cookie_name'   => 'fueldid',    
        'database'      => null,
        'table'         => 'sessions',
        'gc_probability'    => 5
    ),
 
    'redis'    => array(
        'cookie_name'        => 'fuelrid',
        'database'            => 'default'
    )
);


もちろんのことですが、memcached,db,redisはそれぞれがサーバーにインストールされていないとエラーが起こりますので注意してください。



参考引用:FuelPHPのSessionクラスについてまとめてみた。

fuelphpでredisを使ってみた

<? php
//インスタンスの生成

//$nameはredis接続先config.phpのredis設定

$redis = Redis_Db::forge($name);

$redis->set('key', 'value');

$a = $redis->get('key');

var_dump($a) . "\n";

$redis->del('key');

$a = $redis->get('key');

var_dump($a) . "\n";

$redis->rpush('key', 'a');

$redis->rpush('key', 'b');

$redis->rpush('key', 'c');

$redis->rpush('key', 'd');

$a = $redis->lrange('key',0,-1);

var_dump($a) . "\n";

$redis->lpush('key', 'a');

$redis->lpush('key', 'b');

$redis->lpush('key', 'c');

$redis->lpush('key', 'd');

$a = $redis->lrange('key',0,-1);

var_dump($a) . "\n";

//有効期間は一時間 

$redis->expireAt('key',time()+3600);

 //削除

 $redis->del('key');

出力結果

string(5) "value" 

NULL 

array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } 

array(8) { [0]=> string(1) "d" [1]=> string(1) "c" [2]=> string(1) "b" [3]=> string(1) "a" [4]=> string(1) "a" [5]=> string(1) "b" [6]=> string(1) "c" [7]=> string(1) "d" } 

fuelphpでのpagination

fuelphp(ver1.7)のpaginationで少々ハマったのでメモ。

1~7ページまであったとして、

1ページ目にいるとき

1 2 3 4 5 6 >> 最後

2-6ページ目にいるとき

最初 << 1 2 3 4 5 6 7 >> 最後

7ページ目にいるとき

最初 << 1 2 3 4 5 6 7

こんな感じで出力したかったのだが、

すべてのページで、すべてのリンクが出てしまった。

最初 << 1 2 3 4 5 6 >> 最後

色々やった結果以下の様なconfigに設定すればOKだった。

/app/config/pagination.php

<?php

return array(

    // the active pagination template

    'active'                      => 'default',

    // default FuelPHP pagination template, compatible with pre-1.4 applications

    'default'                     => array(

        'wrapper'                 => "<div class=\"pagination\">{pagination}</div>",

        'first'                => "<span class=\"first\">{link}</span>",

        'first-marker'           => "最初&nbsp;&nbsp;",

        'first-link'           => "<a href=\"{uri}\">{page}</a>",

        'previous'                => "{link}",

        'previous-marker'           => "<<",

        'previous-link'           => "<a href=\"{uri}\">{page}</a>",

        'previous-inactive'           => "",

        'previous-inactive-link'      => "",

        'regular'                 => "&nbsp;&nbsp;{link}&nbsp;&nbsp;",

        'regular-link'            => "<a href=\"{uri}\">{page}</a>",

        'active'                  => "&nbsp;&nbsp;<span class=\"active\">{link}</span>&nbsp;&nbsp;",

        'active-link'             => "<a href=\"{uri}\">{page}</a>",

        'next'                => "{link}",

        'next-marker'           => ">>",

        'next-link'           => "<a href=\"{uri}\">{page}</a>",

        'next-inactive'           => "",

        'next-inactive-link'      => "",

        'last'                => "<span class=\"last\">{link}</span>",

        'last-marker'           => "&nbsp;&nbsp;最後",

        'last-link'           => "<a href=\"{uri}\">{page}</a>",

        

    ),

);

ポイントは

'previous-inactive' => "",

'previous-inactive-link' => "",

'next-inactive' => "",

'next-inactive-link' => "",

ここを空で設定すること。

'first-inactive','first-inactive-link','last-inactive','last-inactive-link'

この設定項目は、出力したくない場合は書かなくてもいいみたい。

空で設定するのとそもそも消していいのと、違うのね。。