2011/07/09

Yiiでマルチバイト文字でのバリデーションを行う方法

Yii 1.1から以下のようにルールにencodingを渡すことにより
マルチバイト文字での長さチェック等ができるようです。

array('string', 'length', 'max'=>10 , "encoding" => Yii::app()->charset)

参考URL
http://www.yiiframework.com/forum/index.php?/topic/2721-yii-multibyte-safe/

2011/07/08

codeigniterでpostgresqlで文字化けが治らない場合の対処

またしてもcodeingiterのポスグレのバグを発見しました(通算3つ目)

・phpからpostgresにclient_encodingを送っていない

postgresqlはアプリケーション側でclient_encodingを設定していないと
設定ファイルに書いてあるデフォルトのclient_encodingに変換して結果を返してきます。

修正箇所は
system/database/drivers/postgre/postgre_driver.php

145行目 db_set_charset
中身は無しでコメントにて
// @todo - add support if needed
ふざけんなと( ゚Д゚)ヴォケ!!

pg_set_client_encoding($this->conn_id , $this->char_set);

これで文字化けが直りました。
しかし本当にcodeigniterのpostgresドライバは信用出来ない。
他にも色々バグありそう

2011/07/05

yiiでwhere in でデータを取得

ちょっと詰まった。
フォーラムの記事を参考にして解決
problem with createInCondition

$criteria = new CDbCriteria();
$criteria->addInCondition('id', array(1,2,3));
$result=User::model()->findAll($criteria);

createInCriteria()の第4引数にパラメータうんぬんって書いてあるけど
第4引数はprefixでした。
使ってないので僕の場合は不要。

2011/06/28

YiiでURLからindex.phpを消す方法

.htaccessを変更するだけだとウィジェットで作られるリンク(デフォルトのテンプレートで使われている)
にはindex.phpが付いたままにななるので

config/main.php

'urlManager' => array(
'showScriptName' => false ,
.....

を追加

2011/06/23

centOSのvsftpdの設定で詰まったorz

centOSのvsftpdの設定でつまりました。
ひと通りvsftpd.confの設定を行ったあとffftpから接続しようとすると繋がらない。
色んな設定を試してみたけど解決しない。

※ここまで1時間

接続自体はできているみたいなのでプロンプトからftpで接続してみる
ftp example.com

つながるじゃないか!
普通にコマンドも通る。。。

受動モードの場合だと上手くいかないようだ。
そりゃそうだ。ポート開けてねーよ。

vsftpd.confに
pasv_min_port=60000
pasv_max_port=60100

iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 60000:60100 -j ACCEPT

両方再起動すると無事ftpを使えるようになりました。
あー。無駄な時間使った

2011/06/07

codeigniterでpostgresqlのlike検索にバグがある件

基本的にMySQL向けに作られているフレームワークだとしてもこれはさすがにひどいでしょ。。。
バグは2点みつけてます。
CIのバージョンは1.7.3です。

①点目
[RESOLVED] Undefined property: CI_DB_postgre_driver::$_like_escape_char | CodeIgniter Forums
↑のURLに書いてあるとおりただのスペルミスです。。

From
$like_statement = $like_statement.sprintf($this->_like_escape_str, $this->_like_escape_char);

To
$like_statement = $like_statement.sprintf($this->_like_escape_str, $this->_like_escape_chr);

②点目
「%(パーセント)」「_(アンダースコア)」を含むライク検索が出来ない。

/database/drivers/postgre/postgre_driver.php
299行目

$str = str_replace( array('%', '_',$this->_like_escape_chr),
array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_' , $this->_like_escape_chr.$this->_like_escape_chr),
$str);

str_replaceでエスケープを行っているが配列の順番がおかしいため
エスケープ文字が2コ付くようになってしまっています。
下記のように修正

$str = str_replace( array($this->_like_escape_chr ,'%', '_'),
array($this->_like_escape_chr.$this->_like_escape_chr ,$this->_like_escape_chr.'%', $this->_like_escape_chr.'_' ),
$str);

置換前、置換後の配列の3番目の要素をそれぞれ1番目にもってくる。これでOK。
こんなすぐ分かるバグぐらい誰かフィックスしとけよと。