昔に作ったPHPでDBの情報をエクセルファイルとしてダウンロードできるスクリプトを作ったのですが、久しぶりに動かしてみると動いていない。
前は正常に動いていたのに、今は真っ白な画面・・・
無事解決出来たけど、ハマったので解決方法を共有です。
原因追求
最初はスクリプトを設置するサーバーを変えたので、サーバーの設定の違いかなと思いスクリプト等問題のありそうな箇所を探していたのですが、問題はありませんでした。
正常に動いていないのはエクセルファイルとして書き出す部分だけだったのです。
使っていたのはPEARのSpreadsheet_Excel_Writerパッケージです。
このパッケージの最終更新日は2012年1月・・・
パッケージ自体がPHPのバージョンアップについてこれていない雰囲気ですね。
ということで、Spreadsheet_Excel_Writerについてググる。
いろんなページを見ながら、どんどん時間が過ぎていき、ようやく問題解決できるページを発見。
スクリプト修正
変更するファイルは、/pear/Spreadsheet/Excel/Writer/Worksheet.phpの2490行目にある$this->_append(&$string, true);の「&」を消します。
修正後のコード
該当箇所の関数をまるっと載せておきます。
/** * Store the MERGEDCELLS record for all ranges of merged cells * * @access private */ function _storeMergedCells() { // if there are no merged cell ranges set, return if (count($this->_merged_ranges) == 0) { return; } $record = 0x00E5; foreach($this->_merged_ranges as $ranges) { $length = 2 + count($ranges) * 8; $header = pack('vv', $record, $length); $data = pack('v', count($ranges)); foreach($ranges as $range) $data .= pack('vvvv', $range[0], $range[2], $range[1], $range[3]); $string=$header.$data; $this->_append($string, true); } }
たった1行の変更するだけ!
いやー、この1行の問題を見つけるのに2時間潰れました。
プラグイン、ライブラリ、パッケージは開発時間を短縮してくれるので非常に助かるのですがこういう時は困ってしまいますね~。
このページにたどり着いた方は短時間で問題解決出来たことを願います。
参考URL
PEARのバグ報告に解決法がありましたが、見つけにくかった・・・
Bug #19359 :: Call-time pass-by-reference is disabled in PHP 5.4.0