社員ブログ
HOME  社員ブログ

アーカイブ

‘PHP’ カテゴリ

FuelPHPのModel_CRUDクラスで必要なカラムのみ更新

2013年07月18日 18時13分07秒

こんにちは、ピーターです。
FuelPHP 1.6の話です。

こんなテーブルとモデルがあったとします。

SQL

CREATE TABLE `tb_user` (
  `user_id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50),
  `email` varchar(50),
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

PHP

class Model_User extends Model_Crud
{
    protected static $_table_name = 'tb_user';
    protected static $_primary_key = 'user_id';
}

Model_Crudクラスでfind()してsave()すると、すべてのカラムにセットするUPDATE文が発行されます。

PHP

$user_id = 1;
$user = Model_User::find_by_pk($user_id);
$user->email = 'hoge@example.com';
$user->save();

SQL

UPDATE `tb_user`
SET `user_id` = '1', `name` = 'hoge', `email` = 'hoge@example.com'
WHERE `user_id` = '1'

すべてのカラムにセットされるのは気持ち悪いので、必要なカラムのみセットする方法はないか探してみました。

PHP

$user = Model_User::forge();
$user->user_id = 1;
$user->email = 'hoge@example.com';
$user->is_new(false);
$user->save();

SQL

UPDATE `tb_user`
SET `user_id` = 1, `email` = 'hoge@example.com'
WHERE `user_id` = 1

`name` = 'hoge' はなくなりましたが、まだ `user_id` = 1 が余計ですね。
モデルに $_properties プロパティを追加してみました。

PHP

class Model_User extends Model_Crud
{
    protected static $_table_name = 'tb_user';
    protected static $_primary_key = 'user_id';
    protected static $_properties = [
        'name',
        'email',
    ];
}

そして再度実行。

PHP

$user = Model_User::forge();
$user->user_id = 1;
$user->email = 'hoge@example.com';
$user->is_new(false);
$user->save();

SQL

UPDATE `tb_user`
SET `email` = 'hoge@example.com'
WHERE `user_id` = 1

うまくいきました。

PHP, 社員:ピーター

FuelPHP 1.6 でメールの差出人が文字化け→解決

2013年07月1日 18時21分08秒

こんにちは、ピーターです。

FuelPHP 1.6 のEmailパッケージを使ってUTF-8の日本語メールを送ったら差出人が文字化けしました。
このようにして解決しました。

app\config\email.php
'from' => array(
    'email' => 'info@example.com',
    'name' => mb_encode_mimeheader('差出人', 'UTF-8', 'B', "\n"),
),

PHP, 社員:ピーター

IE iframeを用いてクロスドメインするとcookieが動かない?

2012年07月11日 12時59分16秒

こんにちは、コブラです。

 

タイトルの通り、IEでiframeを使って別のドメインのページを読み込むと、

その中でCookieが思うように使えませんでした。

 

こんな感じ。

 

Parent.html

└ (iframe src=)Child.html → Cookieの読み書き →NG!!

 

Cookieの指定が間違ってる?親フレームのCookie見てる?

でもIE以外は動作してるよ?

???・・・(°Д°;)・・・???

という感じでしたが、

調べたらすぐに原因が分かりました。

 

IEは、セキュリティの観点からクロスドメインによるCookie操作を拒否してたんですね!(このヤロウ!)

 

で、それを許可するには、

ざっくり言うとCookieを使う前にコンテンツポリシーのような宣言をします!

 

PHPの場合は

<?php header("P3P: CP='UNI CUR OUR'"); ?>

とヘッダーで書くだけ。

簡単でした。

これで

Parent.html

└ (iframe src=)Child.html → Cookieの読み書き →OK♪

となりました。

 

 

参考にさせてもらったサイトさん

P3Pコンパクトポリシーをコピペするのが流行らないことを祈る

IEでクロスドメインのiframe内のcookieが取れない

HTML, JavaScript, jQuery, PHP, 社員:cobra