Amazon Campaign

2013年12月4日水曜日

FuelPHP カスタムSQLの実行時のエスケープ

FuelPHP の DB への問い合せは SQL を抽象化した「Query Builder」を使いますが、where句が複雑な場合や副問い合せを行う場合などはメソッド呼び出しが多くなりコードの見通しが悪くなってしまうので、直接 SQL を記述したくなります。

例)Query Builder を使う場合


// 下記SQLを Query Builder を使って記述すると
// SELECT * FROM `users` WHERE `name` != "John" AND `surname` = "Doe"
// AND (`email` = "jim@jim.com" OR `email` = "haha@joke.com")

// 下記のようになります。

$query = DB::select('*')->from('users');

// 最初の where ステートメントをセット
$query->where('name', '!=', 'John');

// あたらしい条件を追加
$query->and_where('surname', 'Doe');

// ネストした where をコールバックで
$query->where(function($query){
    $query->where('email', 'jim@jim.com')
        ->or_where('email', 'haha@joke.com');
});

例)SQL を直接記述する場合

SQL を直接記述する際は DB::query() を使いますが、この場合 Query Builder で行われていた値のエスケープは行われませんので、DB::quote() を使って個別に行います。quate() はエスケープの他にもメソッド名の通りクウォーテーションもしてくれます。

$name = DB::quate($name);
$surname = DB::quate($surname);
$email1 = DB::quate($email1);
$email2 = DB::quate($email2);

$query = "SELECT * FROM users WHERE name != $name AND surname = $surname AND (email = $email1 OR email = $email2)";
$users = DB::query($query, DB::SELECT)->as_object('Model_User')->execute();

FuelPHP UA判定に mbstring 拡張モジュールは不要

UserAgent は Agent クラスで判定する

PHP で UserAgent を判定する場合、mbstring 拡張モジュールをインストールし mb_ereg() 関数などを使って判定しますが、FuelPHP を使っている場合は Agent クラスを使って判定することができます。

例)IE9 未満の判定

// IE9 未満の場合は専用の CSS を出力する
if(Agent::browser() == 'IE' and Agent::version() < 9) {
    echo Asset::css('ie.css');
}

Amazon_ad