1/21PHPExcelではまったこと2点

今、開発している案件でレポートをMySQLからデータを取得してPHPで加工してExcelファイルに書き出すなんてことをしています。テンプレートのExcelファイルを読んだり書いたりために、PHPExcelというライブラリを使っています。

PHPExcelを使って、はまったことが2つありました。一つはExcelファイルの特性かもしれません。

1点目。テンプレートのExcelファイルを更新してPHPExcelで読み込んでみても更新した前の内容のまま。

これは、Excelファイルの中にある元の履歴データからデータを取得しているようです。対処方法は、「名前を付けて保存」で上書き保存しました。もっとよい方法があるかもしれません。

2点目。セルに1文字だけだとUnknown Errorでそのセルが読み込めない。

これはPHPExcelの内部で使っているiconv_substr()のバグでしょうか? とりあえずセルを2文字以上に設定しています。PHPExcelのソースをいじればいいのでしょうね。

PHPのプログラミングに関係していない人には関係ない、自分のための覚え書きでした。

10/04PHPのopen_basedirの設定ではまる

使えるネットのサーバーは、PHPのセキュリティーが厳しくなっている。httpdocsディレクトリ以外にPHPのプログラムからアクセスしようとすると、すべてエラーになる。書き込みはもちろん、request/inludeでのファイル読み込み、file_exists()でのファイル存在チェック、何とPEARライブラリもエラーになる。

原因は、open_basedirの設定。使えるネットのVPSの場合

/var/www/vhosts/ドメイン/conf/vhost.conf

内で

_admin_value

にパスを追加して設定します。詳細は、使えるネットのユーザーフォーラムから。

しかし、PEARの設定は、

/usr/share/pear

/usr/share/PEAR

のように、大文字に合わせなければいけないことに注意。

4/24#PHP の配列関数はたくさんあるのね。

CakePHPのソースを見ていて、自分では使ったことのない配列の関数があった。例えば、array_intersect_key()とか。この関数は、「キーを基準にして配列の共通項を計算する」というものらしいが、その他マニュアルを見るとたくさんの配列関数があった。

自分は配列かどうかとか、要素が含まれているとか、簡単な関数しか使わないが、おそらく用意されている関数に似たような機能を自分で作っていたかもしれない。用意されている関数であれば、処理も速いしバグも少ないかもしれない。もっとマニュアルを読みましょう。> 自分

でも、PHPの場合、たまにバージョンアップをしていくと、推奨の関数ではなくなるとかあるのでとってもマイナーな関数は注意が必要かもしれない。

2/24Cake PHPでファイルのアップロードができないことの解決。

自分で解決したことの忘れないうちのメモ。

Cake PHPのビューで$html->file()のヘルパーを使って、Wavファイルを指定してそのファイルをアップロードしたとき、アクション側でファイル名が$this->dataで渡らないことではまりました。

フォームをシンプルにしてもダメ。WindowsのXAMPPではOKだか、LinuxのApache+PHPだとダメ。WavファイルではないJpegファイルだとOK。ファイル名に空白が入っているのではないかとか、いろいろ試しましたがわからず。半日つぶしました。

結果は、単純。CakePHPには関係ない原因でした。原因はアップロードサイズが大きいこと。ファイルサイズが大きいWavファイルなら当たり前のこと。今までは、ファイルサイズが大きいとエラーを表示したと思っていましたので見逃していました。

.iniに

upload_max_filesize = 100M

post_max_size = 100M

のように大きい値(後で調整しましょう)を設定して、Apacheを再起動したらうまくアップロードできるようになりました。

基本に戻ることが大切。考えていることが間違った方向ではまる典型的なミスでした。

2/02So-net SNSのサービス終了で考えた。

So-net SNSサービス終了との発表がありました。So-net SNSは、OpenPNEの大きな事例として注目していました。また、So-net SNSで運営しているSNSに参加していました。

終了の理由として、収益と運営にかかるコストのバランス、ユーザー数の伸びとのことですが、無料で広告だけでサービスするのは辛いものがあります。

OpenPNE自体は、PHPとMySQLが動くサーバーがあれば簡単に動作するので、私のほうに連絡いただければ設定はできますが、サーバー設定料と使用料はいただきます。OpenPNEのソースコードを読み込んでいますので、カスタマイズも可能です(ちょっと宣伝モードです)。

今は、無料のサービスはいろいろありますが、いつサービスを停止するのがわかりません。以前は、写真のアルバムサービスをどこにするかを考えていましたが、継続してサービスしてくれることが大事です。

たとえば、FlickrとかPicasaウェブアルバムとか、写真ファイルを預かってくれるサービスがありますが、永遠にサービスをやってくれるとは限りません。預けて手元のデータを消してしまうと、突然のサービス停止なんてなると痛い目を会うことになりそうです。やはり、クラウドコンピューティングは永続的ではありません。バックアップを手元に残す必要はありそうです。

2/02PHPでのnull,false,0,array(),””の違いのメモ

PHPでプログラムを作っていると、null,false,0,array(),””の違いを忘れてしまうこと。どんな関数で判定すれば区別するかです。今までは、empty()で判定していましたが、細かく判定できる比較表をPHPのサイトて見つけました。知らないのは自分だけだったかも・・・・。

PHP 型の比較表」を見れば一目瞭然です。その他、==と===との比較の一覧も載っています。参考までに・・・・。

ちゃんとマニュアルを見るべきでした。

1/26#CakePHPのhasAndBelongsToMany(HABTM)で、2つのテーブルの関係を削除したい。

これは悩みました。

例えばCakePHPのサイトのように、RecipeとTagとが多対多の関係でhasAndBelongsToMany()で定義されているとき、レシピに複数のタグを追加するには、Recipeモデルで

$data['Tag’] = array(1,2);
$this->create();
$this->saveAll($data);

なんてすればいいのですが、その関係を削除したいことがあります。単純に

$data['Tag’] = array();
$this->create();
$this->saveAll($data);

とすると、全くTagには影響はありませんでした。ではどうすればいいかというと、正解はこのサイト(Thanks!)。

array()をarray(false)にすればいいのですね。

$data['Tag’] = array(false);
$this->create();
$this->saveAll($data);

これはわかりませんでした。でも、何かおかしな仕様ですが、しかたありません。

1/25CakePHPでMySQLを使うと文字化けする件。単純なミス。

CakePHPでMySQLを使うと、phpMyAdminでみると日本語で格納したテキストが文字化けする件。app/config/database.phpの設定をGoogleで検索して確認しました。

参考にしたサイトは、ここ。MySQLのマニュアルを読めよ。> 自分

‘encoding’ => ‘utf8′

にしなければいけないところ、

‘encoding’ => ‘utf-8′

にしていました。何て単純なミスなの。

1/19PHPでExcelファイルで時間を読み込むと値がおかしくなる。

PHPのプログラムからExcelファイルに時間がセルにあると、正しい値が読み込むことができません。

使ったPHPのExcelファイルを読み込むライブラリは、Spreadsheet__ReaderとPHPExcel。どちらもダメ。ソースを追ってみたがわからない。03:00と時間を読み込むと、0.125になる。Excelで書式を変えてみると、0:febfeb:になってしまう。何か、ライブラリ側で書式の設定があるかも。

仕方ないので、Excelファイル側で書式を文字列にしてもらうことにする。後で解決策があれば、変更しましょう。

Spreadsheet_Excel_Readerは、セルに何も値を格納していなければ、PHPで取り出した配列には何も出てこないのね。nullか空白文字を期待してアクセスすると変数の未定義エラーになる。Spreadsheet_Excel_Readerクラスのvalメソッドを使わなければいけない。配列を追っていくときには注意。

後、Excelのブック内のシート数はどこにも格納されていないのね。いろいろと使いにくいところがある。

1/06Androidスマートフォン。auはまだかいな? #android #google

Googleから自社製スマートフォン「Nexus One」が正式発表されましたね。記事によると携帯電話向けOS「」を採用した似たような端末が日本でも発売されるとのこと。しかし、ソフトバンクとドコモだけらしい。

今使っている携帯電話はauです。この辺りは、auは遅れている。早く出さないと、乗り換えるよ。> au