fgetcsv の代替関数

fgetcsv は便利な関数だが、Windowsデータとの連携に問題がある。

WindowsからCSVをアップロードする場合、Shift-JIS がほとんどだと思われる。
一方、fgetcsv関数はロケール設定を考慮するため、システムのロケールとCSVファイルの文字コードが一致していないと正しく解析されない。

色々調べたが、レンタルサーバでもしっかり動かすため、代替関数を作成した。

あきらはメインコントロールのクラスに定義している。

    
    // File Get CSV
    
    function fgetcsv( &$fh, $test = false ) {
        if ( feof( $fh ) ) return false ;
        
        $csv = '' ;
        
        while ( ! feof( $fh ) ) {
            $csv .= mb_convert_encoding( fgets( $fh ), 'UTF-8', 'SJIS-win' ) ;
            if ( ( ( preg_match_all( '/"/', $csv, $matches ) ) % 2 ) == 0 ) break ;
        }
    	
        $values = array() ;
        
        $temp = preg_replace( '/(?:x0Dx0A|[x0Dx0A])?$/', ',', $csv, 1 ) ;
        
        preg_match_all( '/("[^"]*(?:""[^"]*)*"|[^,]*),/', $temp, $matches ) ;
        
        for ( $i = 0 ; $i < count( $matches[ 1 ] ) ; $i++ ) {
            if ( preg_match( '/^"(.*)"$/s', $matches[ 1 ][ $i ], $m ) ) {
                $matches[ 1 ][ $i ] = preg_replace( '/""/', '"', $m[ 1 ] ) ;
            }
            
            $values[] = $matches[ 1 ][ $i ] ;
        }
        
        return $values ;
    }

クラス内で以下の様に使う。

    $fh = fopen( $path ) ;

    while ( ( $data = $this->fgetcsv( $fh ) ) !== false ) {
        ...
    }

    fclose( $fh ) ;

参考サイト :
Perlメモ – 値に改行コードを含む CSV形式を扱う
EthnaWiki – php/Tips/csv

PHPで暗号化

パスワードをデータベースに保存する場合、MD5などの不可逆暗号を用いた方がセキュリティー上好ましい。
パスワードは再度入力されるものなので、暗号化した結果を比較すればよい。

それでは、口座番号などの個人情報をデータベースに保存する場合はどうだろう。

これは再度入力される性質のものではなく、保存しておく性質のものだ。
必要な時には表示させたい。

このようなときには Blowfish などの可逆暗号化を行う。

以下のような関数を準備しておけば便利だ。

function encrypt( $key, $text ) {
    srand() ;
    
    $iv_size = mcrypt_get_iv_size( MCRYPT_BLOWFISH, MCRYPT_MODE_CBC ) ;
    $iv = mcrypt_create_iv( $iv_size, MCRYPT_RAND ) ;
    
    return base64_encode( $iv . mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_CBC, $iv ) ) ;
}


function decrypt( $key, $base64 ) {
    $iv_encrypt = base64_decode( $base64 ) ;
    
    $iv_size = mcrypt_get_iv_size( MCRYPT_BLOWFISH, MCRYPT_MODE_CBC ) ;
    $iv = substr( $iv_encrypt, 0, $iv_size ) ;
    $encrypt = substr( $iv_encrypt, $iv_size ) ;
    
    return rtrim( mcrypt_decrypt( MCRYPT_BLOWFISH, $key, $encrypt, MCRYPT_MODE_CBC, $iv ), "" ) ;
}

CentOS 5 では、php-mcrypt パッケージが必要なのでインストールしておくこと。

PHPのリロード対策を誤っていました!

ブラウザーの更新・移動ボタンをクリックすると、フォームデータの再送信をするか確認が表示される場合がある。

原因は、POSTメソッドでパラメータが送信されているため、ページの表示にパラメータが必要とブラウザーが判断するためだ。

PHPでこれを表示させないためには、パラメータをセッション変数に保存し、Location ヘッダーに自分自身を指定して送信するのが一般的だ。

少し前は、以下の様に実装していた。

if ( isset( $_POST[ 'command' ] ) ) {
パラメータの処理
...
header( 'Location: ' . $_SERVER[ 'PHP_SELF' ] ) ;
exit ;
}

しかし、これだと以下のようなフォームでページが呼び出された場合にうまく行かない。

<form method="POST" action="reload.php">
<input type="submit" value="戻る" />
</form>

上記実装では command パラメータが与えられる事を前提としているのに、パラメータは何も渡って来ない。

正しい実装は以下の様にするべきだ。

if ( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' ) {
パラメータの処理
...
header( 'Location: ' . $_SERVER[ 'PHP_SELF' ] ) ;
exit ;
}

さらにHTMLではJavaScriptで送信ボタンを無効化しておくとよい。

<script type="text/javascript"><!--
var submitted = false ;
function form_submit()
{
if ( submitted ) return false ;
submitted = true ;
return true ;
}
// -->
</script>
...
<form name="form_send" onsubmit="return form_submit();">
...
</form>

編集エリアに CSS を設定する方法

FCKeditor では、編集エリアの CSS を指定する事ができる。
これにより、実際のページと同じイメージで編集ができる。

指定方法は以下の通り。

1. CSS を外部ファイルで準備する。
2. FCKConfig,EditorAreaCSS に CSS の外部ファイルのパスを設定する。
3. 複数の外部ファイルを指定するには、配列で設定する。

例えば、以下の様に設定する。

FCKConfig.EditorAreaCSS = new Array( '/css/common.css', '/css/box.css', '/css/detail.css' ) ;

動的に指定するには、以下の様にする。

<script type="text/javascript"><!--
...
window.onload = function()
{
...
oFCKeditor.Config['EditorAreaCSS'] = '/js/<?php echo $_SESSION[ 'code' ] ; ?>.css' ;
...
oFCKeditor.ReplaceTextarea() ;
}
...
// -->
</script>

と、ここまでは良いのだが、複数の外部ファイルに動的なものを含めようとするとうまく行かない。
たとえば、以下のような場合。

続きを読む

Skypeは楽しい!

最近、Skypeを使い始めた。

Skypeとは、P2Pソフトで、主な機能はIP通話・チャット・ファイル転送などだ。
IP通話は10人までの会議も出来る。
無料でダウンロード可能で、Skype同士なら無料通話が可能だ。
有料サービスで留守録・一般電話への通話・一般電話への転送が可能。

マイクとスピーカーがあれば使用出来るのだが、ハウリングしやすいので、ヘッドセットの購入を勧める。
Skype用のヘッドセットが千円程度で売られている。

メーカーパソコンなどでマイクが正しく認識されない場合は、USBオーディオ変換アダプターを使うと良い場合がある。
これも実売価格2千円程度なので、購入を勧める。

初めは仕事の連絡用で始めたが、現在は公私共に使っている。

最近は中国の友達もできた。日本語の勉強中の女性だ。
最初はチャットから始めて、いまは普通に会話をしている。

とにかく楽しいので、一度経験して損は無い!

自作プラグインのデバッグ

FCKeditor 2.4.3 のテストを行った。
多くの細かいバグが修正されており、非常に気持ち良い。
特にIEへの対応がすばらしい。

ついでに自作プラグインのテストも行った。

…Lightboxが、動かない。

2.4 以降で内部的に大幅な修正がされているのは知っていた。
しかし、ダイアログで使うメソッドまで修正されているとは…

その他、FileBrowser_Thumbnailの細かなデバッグを行った。
・画像以外で 横x縦 を表示しないように修正
・一覧を float で表示するよう修正

ダウンロード for FCKeditor 2.4.x :
Lightbox.zip
Lightbox_Plus.zip
FileBrowser_Thumbnail.zip

ダウンロード for FCKeditor 2.3.x :
Lightbox.zip
Lightbox_Plus.zip

お誕生日おめでとう!

このブログを見る事は無いだろうけど、今日は妹の誕生日。
妹と言っても30代半ばの2時の母だが。

妹は片田舎の鳥取市から、これまた片田舎の大阪府門真市に嫁いだ。
いまではりっぱな「おかん」になった。

しかし、「おかん」への道は易しい物じゃなかったようだ。

ある日、豚汁にサツマイモを入れたところ、
「こんな甘い味噌汁が飲めるか!」
と激怒されたそうだ。

妹はおいしい豚汁を、家族と食べたかっただけなのに。

相手はお好み焼きをご飯のおかずにする人だけに、さぞかし悔しかっただろう。

あきらとしては、「豚汁にサツマイモ」は美味いと思う。
トンガラシをぱらぱらっとすると、さらに美味い。

みなさんは、どう思いますか?

攻撃されてる? – その後

昨日からブログのアクセスカウントが異常だった。
今朝にはアクセスが落ち着いた。

アクセスログを参照して原因が判明した。

サーチエンジンだった。

このブログは、サーチエンジンのアクセスを別カウントするように設定していたのだが…

どうも ID-Search.com というロシアのサーチエンジンだったようだ。
しかし、数万回もアクセスをしてくるなんて、とんでもないサーチエンジンだ。

びっくりした。

攻撃されてる?

どうもこのサイトは攻撃を受けているらしい。
約1秒に1件の割合で、ブログのアクセス数がカウントされている。

普段は3桁のアクセスが5桁になっている。実に100倍。
特に土日はアクセスが下がるはずなのにおかしい。

詳しくはログを分析しようと思っているが、サーバーのアクセスログが作成されるのが午前4時なので、明日になる。

サクラインターネットと相談かなぁ。面倒だなぁ。

しかし、a-blog 自体がどういう仕様でアクセスカウントをしているか、さっぱり判らないなぁ。