2012年8月19日日曜日

phpでのURLエンコード、デコード

結論

エンコードはrawurlencode()
デコードはurldecode()
関数を使う。

エンコード

rawurlencode
 RFC1738に準拠したエンコードを行う。
 半角スペースを「%20」に変換

urlencode
 ブラウザからのformポストなどはこのエンコード方式。
 (application/x-www-form-urlencoded形式)
 半角スペースは「+」に変換される。

APIなどへのアクセスで利用するエンコード方式はRFC1738系が多く、amazonのAPI等ではRFC1738に準拠してないデータはエラーになる。下記デコード時の理由等もあり、エンコード時はrawurlencodeを使う方が無難。


デコード

逆にデコードの場合はrawurldecodeはRFC1738での動作しかしない為、「+」が半角スペースにデコードされない。
urldecodeでは%20も+も半角スペースに変換される為、デコード時はurldecodeが無難。

2012年8月8日水曜日

mysqlで複数行のあるカラムをインクリメントしつつ更新


> set @incr = 1;
> update some_table set some_column = @incr := @incr+1;


8.4. ユーザによって定義された変数
http://dev.mysql.com/doc/refman/5.1/ja/user-variables.html

というかそのまんまの内容があった。。

Set iterative values in rows of a table
http://stackoverflow.com/questions/6352705/set-iterative-values-in-rows-of-a-table

2012年8月7日火曜日

phpで$hoge->fuga['ok'] = 1;を可能にする方法

結論:__get()の& 参照渡し が重要
class A {
    private $_data;
    public function __get($name)
    {
        return $this->_data[$name];
    }

    public function __set($name, $value)
    {
        $this->_data[$name] = $value;
    }
}

$a = new A;
$a->hoge = 1;
echo $a->hoge;  // 1

// 以下はエラーにはならないが、期待通りに動かない
$a->hoge['a'] = 1;
echo $a->hoge['a']; // null

// 上記は一度ゲッター(__get)から$_data['hoge']を引き出す際に
// コピーしてから['a']=1を設定してるので、インスタンス内の変数に影響を及ぼせない。
// リファレンスを使う。
class B {
    private $_data;
    public function & __get($name)
    {
        // メソッド定義時の"&"により返り値が参照返しになる
        return $this->_data[$name];
    }

    public function __set($name, $value)
    {
        $this->_data[$name] = $value;
    }
}
$b = new B;
$b->hoge['a'] = 1;
echo $b->hoge['a']; // 1
ただし副作用として思わぬところでデータを変更しちゃうかも。 使い分けが重要か。